选择排序是:
每一轮比较记录最小值的下标,一轮比较完成后,将最小值与数组第一位交换位置。
举例说明(升序排序):
数组 arr = [1, 4, 2, 6, 67, 111, 3, 5]
第一轮比较:默认最小值下标smallest=0
- 第1次:下标1和smallest比较,4 > 1, smallest = 0;
- 第2次:下标2和smallest比较,2 > 1, smallest = 0;
- 第3次:下标3和smallest比较,6 > 1, smallest = 0;
- 第4次:下标4和smallest比较,67 > 1, smallest = 0;
- 第5次:下标5和smallest比较,111 > 1, smallest = 0;
- 第6次:下标6和smallest比较,3 > 1, smallest = 0;
- 第7次:下标7和smallest比较,5 > 1, smallest = 0;
一轮比较完成发现,下标smallest没有改变仍等于默认值,则数组不变,仍为 [1, 4, 2, 6, 67, 111, 3, 5],此轮比较确定数组第一位的最小值。
第二轮比较:第一轮比较已确定数组第一位最小值,所以第二轮比较数组的第0位不参加比较,从第1位开始比较,所以默认最小值下标smallest=1
- 第1次:下标2和smallest比较,2 < 4, smallest = 2; 下标2小于smallest,修改smallest为2
- 第2次:下标3和smallest比较,6 > 2, smallest = 2;
- 第3次:下标4和smallest比较,67 > 2, smallest = 2;
- 第4次:下标5和smallest比较,111 > 2, smallest = 2;
- 第5次:下标6和smallest比较,3 < 2, smallest = 2;
- 第6次:下标7和smallest比较,5 > 2, smallest = 2;
此轮比较完成发现,下标smallest已改变,则交换smallest和数组第1位的数,仍为[1, 2, 4, 6, 67, 111, 3, 5]
第三轮比较:前2轮比较已确定数组第0-1位,所以此轮比较从第2位开始比较,默认最小值下标smallest=2,比较方法如上,一轮下来比较发现第6位的3比smallest所在的第2位的值4小,smallest就改为6,然后拿smallest的值和第2位交换数值,结果为 [1, 2, 3, 6, 67, 111, 4, 5]
依此类推,最终做出数组的正确排序。具体实现如下:
/* 方法说明
* @method selectionSort
* @param {Array} arr, 需要排序的数组
* @return {Array} 返回排序后的数组
*/
function selectionSort(arr) {
const len = arr.length;
// smallest 用于记录最小值下标
// swap 是用于交换两个值得中间变量
let smallest, swap;
for (let i = 0; i < len - 1; i ++) {
smallest = i;
for (let j = i + 1; j < len; j ++) {
if (arr[j] < arr[smallest]) {
smallest = j;
}
}
if (smallest !== i) {
swap = arr[i];
arr[i] = arr[smallest];
arr[smallest] = swap;
}
// console.log(arr);
}
return arr;
}
const arr = [1, 4, 2, 6, 67, 111, 3, 5];
selectionSort(arr)