排序算法之选择排序

107 阅读2分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

选择排序

  • 选择排序:是一种原址比较的排序算法。
  • 核心思想:找到数据结构中的最小值,并将其放在第一位,接着找到第二小的值,将其放在第二位,以此类推。

实现

function selectionSort(arr) {
    // 记录待排序数组长度
    let len = arr.length;
    // 记录最小值下标
    let indexMin = null;
    // 外层循环迭代数组,同时控制迭代轮数
    for (let i = 0; i < len - 1; i++ ) {
        // 先 假设 本迭代轮次的第一个值为数组的最小值
        indexMin = i
        // 内层循环则从迭代值数组末尾
        for (let j = i; j < len; j++) {
            // 比较内层循环的当前迭代元素 是否 比外层我们假设的当前最小值 小
            if(arr[indexMin] > array[j]) {
                // 如果小的话,则将记录最小值的下标的变量的值更新为当前的 内存循环迭代下标,即 j
                indexMin = j
            }
        }
        // 当所有的内层迭代结束之后,则可以找到数组 第 n 小的值。
        // 如果 该第n小的值和原来的最小值时不同的话,则交换位置。
        if(i != indexMin) {
            // 交换位置
            let temp = array[i];
            array[i] = array[indexMin];
            array[indexMin] = temp;
        }
    }
}

注意:minIndex 始终保存着最小值的位置的索引,随着i的自增,遍历的数组长度越来越短,直到完成排序。 解析:

  • 比方说我们用选择排序来对[5,4,3,2,1]数组进行排序。
  • 在外层第一次循环的时候 将 第0位作为 indexMin;
  • 然后进行内层循环,从 第0 位开始循环,依次和我们假定的最小值做比较;
  • 如果内层循环中的当前下标所表示的值,比我们假定的indexMin代表的值小,那么就更新 indexMin的值为 当前下标。
  • 内层循环结束的时候,即可拿到此时的代表数组最小值的元素的下标。
  • 然后,拿着此时更新后的indexMin 跟我们外层的当前循环下标 i做比较,不等的话则交换两者的值。
  • 到此,外层一轮循环结束,此时我们数组的第0位已经变成了最小值。
  • 接着。开始第二轮循环,此时内层循环则从数组的第 1 位开始,也就是外层循环的 i 值。
  • 依此类推。

最后

  • 选择排序,同样也是一个复杂度为O(n2)的算法。
  • 和冒泡排序一样,选择排序也包含有嵌套的两个循环,这就导致了二次方的复杂度。
  • 同样的,也是不推荐使用。