簡明算法: 選擇排序(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 ]
相關文章
相關標籤/搜索