选择排序--js

394 阅读2分钟

选择排序是:

每一轮比较记录最小值的下标,一轮比较完成后,将最小值与数组第一位交换位置。

举例说明(升序排序):

数组 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)