选择排序思想
选择排序的思想非常简单:
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。
——《算法(第四版)》
此算法的实现非常简单,通俗地说就是一共遍历n( n = array.length )趟,第i趟( 0 < i < array.length )在剩余的元素(array[i + 1] ~ array[length - 1])中找出最小值元素,交换至array[i]——每一趟都是一次选择最小值,然后交换,直至遍历完成
图例:
核心代码
此算法的实现非常简单,以下为排序的核心代码
sort(array) {
for (let i = 0; i < array.length; i++) {
//遍历元素下标
let minIndex = i;
let j = i + 1;
for (; j < array.length; j++) {
//寻找最小值
if (this.less(array[j], array[minIndex])) {
minIndex = j;
}
}
this.exch(array, i, minIndex);
}
}
复制代码
全部代码于CodePen之中:
CodePen打开
选择排序特点
选择排序非常简单,我们也可以发现有两个特点:
- 运行时间和输入无关
- 数据移动是最少的
运行时间和输入无关
为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息 ——《算法(第四版)》
无论数据的初始状态如何,选择排序都会将所有元素进行遍历。因此,无论输入数据是排序好的数组还是随机数组,其运行时间都是相同的。此算法不善于利用输入的初始状态
数据移动是最少的
每次交换都会改变两个数组元素的值,因此选择排序用了N次交换——交换次数和数组大小是线性关系。 ——《算法(第四版)》