A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庭院深深深几许 金牌黑马   /  2019-4-17 13:07  /  807 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

   选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
  算法描述(从小到大排序):
    有 N 个元素需要排序,首先将0号位元素与后面的元素一一比较,如果有比0号位元素小的元素就进行调换,如果没有就不进行调换,将后面的元素都比较完,0号位置的元素是所有元素中最小的,然后将1号位元素与后面的元素一一比较,如果有比1号位元素小的元素就进行调换,如果没有就不进行调换,将后面的元素都比较完,1号位元素是第二小的,依次类推…
  选择排序的时间复杂度是O(n^2),是一种不稳定的排序算法
  

[C] 纯文本查看 复制代码
#include
#define N 11
int main(void)
{
    int a[N] = {70,30,40,10,80,20,90,100,78,60,45} ;
    int i, j , temp;
    printf("原序列为:") ;
    for(i=0 ;i<n ;++i)
        printf("%d ",a[i]) ;
        
    /*选择排序*/
    for(i=0; i<n-1; ++i)
    {
        for(j=i+1; j<n; ++j)
        {
            if(a[i]>a[j])
            {
                temp = a[i] ;
                a[i] = a[j] ;
                a[j] = temp ;
            }
        }
    }
    
    printf("排后序列:") ;
    for(i=0; i<n; ++i)
        printf("%d ",a[i]) ;
    printf("") ;
    return 0 ;
}

    代码讲解:
  数组a中存放的是待排序的元素
  变量 i 和 j 是控制循环的变量
  temp是临时变量,用来交换元素
  Q:为什么外层for循环的条件设置为 i < N-1?
    从整体上看,一共有N个元素,每次交换的时候会有两个元素进行比较,一共需要比较N-1次,最后一个元素过N-1次比较之后就已经放到了正确的位置,所以外层for循环只需要比较N-1次就可以了
  Q:为什么内层for循环的初始化设置为 j=i+1?
    选择排序是将当前位置与后面的所有元素都进行比较,与自身比较没有意义,对于排好序的元素已经在数组的前面部分,不需要参与后面的循环比较,所以直接跳过,与后面的元素进行比较即可
  Q:为什么内层for循环的条件设置为 j
    选择排序是将当前位置与后面的所有元素都进行比较,所以自然要比较到最后一个元素,而在数组中最后一个元素的下标是N-1,所以循环条件设置为j

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马