选择排序
一、原理
☆思想:每次选出最小值,作为无序集合首元素,最终得到递增序列;
☆过程:以递增为例,用数组表示,长度为n,整个数组为无序集合;从首元素开始循环,记录首元素索引作为最小值索引,后续每个元素都和最小值索引对应元素相比,如果小于则记录该元素索引为最小值索引,直到最后一个元素,交换首元素和最小值索引对应元素,首元素就是最小元素,除首元素外数组为无序集合;
再从第二个元素开始循环,直到最后一个元素,第二个元素就是无序集合最小值;反复循环,每次获得剩余元素中的最小值,最终数组为升序;
二、实现代码
JavaScript 代码实现
function SelectSort(arr) { var minpos, temp; for (var i = 0; i < arr.length - 1; i++) { minpos = i; for (var j = i + 1; j < arr.length; j++) { if (arr[minpos] > arr[j]) { minpos = j; } } if (minpos != i) { temp = arr[i]; arr[i] = arr[minpos]; arr[minpos] = temp; } console.log(i + '.:' + arr); } }
三、优化
网上看到如下方法,每次循环得到最小和最大值,减少了循环,但比较和交换次数并没有减少,效率没有多少提升,仅供参考;
//原文链接:https://blog.csdn.net/zhangxiaoyu_sy/article/details/75000151 //如果在每一次查找最小值的时候,也可以找到一个最大值,然后将两者分别放在它们应该出现的位置,这样遍历的次数就比较少了 function SelectSortOpt(a) { var left = 0, right = a.length - 1; var min, max; //存储最小值、最大值的索引 while (left <= right) { min = left; max = left; for (var i = left; i <= right; ++i) { if (a[i] < a[min]) min = i; if (a[i] > a[max]) max = i; } //交换left和min元素 swap(a, left, min); //最左元素被交换到min,需要重新定位 if (left == max) max = min; //交换right和max元素 swap(a, right, max); ++left; --right; console.log(a); } } function swap(arr, i, j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
四、复杂度
| 名称 | 时间复杂度 | 空间复杂度 | 稳定性 | ||
| 平均 | 最坏 | 最优 | |||
| 选择排序 | O(n²) | O(n²) | O(n²) | O(1) |
X |
最坏情况,数组反序,最小元素,需要进行n-1次比较,一次交换…第二大元素,需要进行1次比较,一次交换,共需要1+2+3+……+(n-1)=n(n-1)/2次比较,Math.floor(n/2)次交换;
最优情况,数组正序,最小元素,需要进行n-1次比较,不用交换…第二大元素,需要进行1次比较,不用交换,共需要1+2+3+……+(n-1)=n(n-1)/2次比较,0次交换;
本排序需要申请一个额外空间;
使用数组表示,相同元素顺序可能变化,本排序不稳定。

浙公网安备 33010602011771号