「这是我参与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;
}
}
}