首页 > 代码库 > 选择排序

选择排序

一。概念

每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。

 

二。示例

初始序列:               49 27 65 97 76 12 38 }

第1趟:12与49交换:12 { 27 65 97 76 49 38 }

第2趟:27不动 :    12 27 { 65 97 76 49 38 }

第3趟:65与38交换:12 27 38 { 97 76 49 65 }

第4趟:97与49交换:12 27 38 49 { 76 97 65 }

第5趟:65与76交换:12 27 38 49 65 { 97 76 }

第6趟:97与76交换:12 27 38 49 65 76 97 

 

三。代码

简单选择排序的算法具体描述如下:
    static void SelectSort(int r[]){ //对数组r做简单选择排序        int i, j;        for ( i = 0 ; i < r.length; i++) {                         int index = i ;                                 //第i+1趟,从i+1位置开始查找            for ( j = i+1 ; j < r.length ; j++){     //查找到最后一位                if (r[j] < r[index] ){                      //查找最小记录的位置                      index = j;                             //index 用来保存查找到的最小记录的位置                }             }                  if ( index != i) {              int temp = r[i];               r[i]= r[index];  //把最小的放在i位置               r[index] = temp;            }       }    } 

 

四。分析 

  在简单选择排序过程中,所需移动记录的次数比较少。最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录。

最坏情况下,需要移动记录的次数最多为3(n-1)(此情况中待排序记录并非完全逆序,给完全逆序记录排序的移动次数应为(n/2)*3,其中n/2向下取整)。

  单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。当i=1时,需进行n-1次比较;当i=2时,需进行n-2次比较;

依次类推,共需要进行的比较次数是∑ =(n-1)+(n-2)+…+2+1=n(n-1)/2,即进行比较操作的时间复杂度为O(n2)。