简明算法: 选择排序(javascript描述)

懒惰了好久,人有点生锈,因此写个算法系列让本身脑筋活跃起来。算法

(全部范例一概从小到大排序)数组

选择排序比冒泡的改进是,不会频繁交换元素,而只是记录索引,最后再交换。测试

选择排序code

给定数组:排序

var list = [ 54, 26, 93, 17, 77, 31, 44, 88, 55, 20 ];

算法描述:索引

  1. 首先设k=0,假定首元素既索引k表明最小元素,而后将第一个元素与第二个元素对比,若是第一个元素比第二个元素大,更改此时的索引k=1,既如今第二个元素是最小元素,此时:io

    k = 1;
  2. 将第二个元素与第三个元素对比,此时第二个元素比第三个元素小,保持原样不变;console

    k = 1;
  3. 重复上面的步骤,直到最后咱们用倒数第二个元素与倒数第一个元素相比以后;通过第一轮排序,咱们肯定了最小元素的索引,而后与首元素交换位置,此时最小元素排列在数组首尾;function

    k = 3;
      [list[0], list[3]] = [list[3], list[0]];
  4. 而后咱们重复1,2,3步骤;通过第二轮咱们会找到次小的元素索引,放到数组第二位;select

    k = 9;
     [list[1], list[9]] = [list[9], list[1]];
  5. 再次重复直到整个数组有序;

    第1轮: [ 17, 26, 93, 54, 77, 31, 44, 88, 55, 20 ]
    第2轮: [ 17, 20, 93, 54, 77, 31, 44, 88, 55, 26 ]
    第3轮: [ 17, 20, 26, 54, 77, 31, 44, 88, 55, 93 ]
    第4轮: [ 17, 20, 26, 31, 77, 54, 44, 88, 55, 93 ]
    第5轮: [ 17, 20, 26, 31, 44, 54, 77, 88, 55, 93 ]
    第6轮: [ 17, 20, 26, 31, 44, 54, 77, 88, 55, 93 ]
    第7轮: [ 17, 20, 26, 31, 44, 54, 55, 88, 77, 93 ]
    第8轮: [ 17, 20, 26, 31, 44, 54, 55, 77, 88, 93 ]
    第9轮: [ 17, 20, 26, 31, 44, 54, 55, 77, 88, 93 ]

算法实现:

function select(list) {
  // 作length-1轮比较
  for (let i = 0; i < list.length - 1; i++) {
    // 假定k是最小元素
    let k = i;
    // 两两对比 找到比最小元素还小的索引
    for (let j = i + 1; j < list.length; j++) {
      if (list[j] < list[k]) {
        k = j;
      }
    }
    // 交换
    [list[i], list[k]] = [list[k], list[i]];
  }
}

// 测试
var list = [ 54, 26, 93, 17, 77, 31, 44, 88, 55, 20 ];
select(list);
console.log(list);
// [ 17, 20, 26, 31, 44, 54, 55, 77, 88, 93 ]
相关文章
相关标签/搜索