直接选择排序详解

364 阅读3分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战

介绍

直接选择排序是选择排序中的一种,它的基本思想是每一趟从数组中选出关键字最小(或最大)的一个数字,按顺序放在已排序好的关键字最后,直到全部排完为止。选择排序是不稳定的排序方法。

在直接选择排序中,移动的次数较小,主要是比较的次数。最好情况(正序):不移动。最坏情况(逆序):移动3(n-1)次。它的时间复杂度为O(n^2),空间复杂度只使用了k和temp两个变量,所以空间复杂度为 O(1)。

详解

现在有一个数组[49,38,65,97,76,13,27,10,30,31],我们需要通过直接插入排序对其进行排序。主要方法是从下标0开始遍历,找出数组中最小的数字,然后移动到下标为0的位置,然后继续从下标1遍历,重复这个过程,直到排序完成。
具体过程:用[]把排序好的序列扩起来

初始    49   38  65  97  76  13  27  10  30  31 
第一趟  [10]  38  65  97  76  13  27  49  30  31 
第二趟  [10   13] 65  97  76  38  27  49  30  31 
第三趟  [10   13  27] 97  76  38  65  49  30  31 
第四趟  [10   13  27  30] 76  38  65  49  97  31 
第五趟  [10   13  27  30  31] 38  65  49  97  76 
第六趟  [10   13  27  30  31  38] 65  49  97  76 
第七趟  [10   13  27  30  31  38  49] 65  97  76 
第八趟  [10   13  27  30  31  38  49  65] 97  76 
第九趟  [10   13  27  30  31  38  49  65  76] 97 
第十趟  [10   13  27  30  31  38  49  65  76  97] 

通过两个循环,每趟从未排序序列中找出一个最小值,插入到一排序序列,就是这个算法的关键。

代码

JavaScript 版本

function selectSort(arr) {
    var k, // k指向每趟排序关键值最小的下标
        temp;
    for(var i=0; i<arr.length; i++) {
        k = i;
        for(var j = i+1;j<arr.length;j++) {
            if(arr[j] < arr[k]) k = j;
        }
        if(k!==i){
            temp = arr[i];
            arr[i] = arr[k];
            arr[k] = temp;
        }
    }
    return arr;
}

C++ 版本

void SelectSort(int a[], int length)
 {
    //对数组a排序,length是数组元素数量
    for( int i = 0; i < length; i++ ) {
      // 找到从i开始到最后一个元素中最小的元素,k存储最小元素的下标.
      int k = i;
      for( int j = i + 1; j < length; j++ ) {
        if( a[j] < a[k] ) { k = j; }
      }
 
      // 将最小的元素a[k] 和 开始的元素a[i] 交换数据.
      if( k != i ) {
         int temp;
         temp= a[k];
         a[k] = a[i];
         a[i] = temp;
      }
    }
}