算法熟记-排序系列-选择排序

1. 简述

    假设待排序数组为 int array[], 数组长度为n。
    第1趟排序,从array[0]-array[n-1]中,选择最小的元素,如果该元素不是array[0],则与其交换。
    第2趟排序,从array[1]-array[n-1]中,选择最小的元素,如果该元素不是array[1],则与其交换。
    ···
    第n-1趟排序,从array[n-2]-array[n-1]中,选择最小的元素,如果该元素不是array[n-2],则与其交换。

2. 复杂度

    交换的次数介于[0,n-1],但是比较的次数是(n+1)*n/2左右。最好、最坏和平均的比较次数都是固定的,因此时间复杂度是O(n^2)。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
    稳定性上,属于不稳定的排序。例如:5 8 5 2 9,第一次会把5和2交换,这样前面的5就会换到后面去了。
3. 代码   

void selection_sort(int array[], int n) {
  
int pos;
  
for(int i=0; i<n-1; i++) {
    pos 
= i;
    
for(int j=i+1; j<n; j++) {
      
if(array[j] < array[pos]) {
        pos 
= j;
      }
    }
    
if(pos == i) continue;
    swap(array[pos], array[i]);
  }  
}

4. 参考资料

    维基百科-选择排序    http://en.wikipedia.org/wiki/Selection_sort

posted @ 2011-06-07 22:38  xiaodongrush  阅读(216)  评论(0编辑  收藏  举报