算法学习:选择排序

前言

自从算法课结课后就不多系统地学习、总结算法相关的知识了,因此但愿以文章记录算法,进行总结。所记录的算法均学习自《算法(第4版)》,此书代码采用Java编写,本人使用js复现。算法

选择排序思想

选择排序的思想很是简单:数组

首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(若是第一个元素就是最小元素那么它就和本身交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法叫作选择排序,由于它在不断地选择剩余元素之中的最小者。
——《算法(第四版)》less


此算法的实现很是简单,通俗地说就是一共遍历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打开this

选择排序特色

选择排序很是简单,咱们也能够发现有两个特色:spa

  • 运行时间和输入无关
  • 数据移动是最少的

运行时间和输入无关

为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息 ——《算法(第四版)》code

不管数据的初始状态如何,选择排序都会将全部元素进行遍历。所以,不管输入数据是排序好的数组仍是随机数组,其运行时间都是相同的。此算法不善于利用输入的初始状态cdn

数据移动是最少的

每次交换都会改变两个数组元素的值,所以选择排序用了N次交换——交换次数和数组大小是线性关系。 ——《算法(第四版)》blog

结语

选择排序很是简单。没撒好说。🤖排序

参考资料

《算法(第四版)》

相关文章
相关标签/搜索