算法導論之js實現--插入排序

插入排序


排序問題

  • 輸入:n個數的一個序列<a1, a2, ..., an>
  • 輸出:輸入序列的一個排列<a1', a2', ..., an'>,知足a1' <= a2' <= ... <= an'

思路

插入排序的工做方式像許多人排序一手撲克牌:數組

  1. 左手爲空,桌子上牌面向下
  2. 每次從桌子上拿走一張牌插入左手中正確的位置
  3. 爲了找到正確位置,從右到左將它與已經在手中的每張牌進行比較,而後插入
  4. 重複步驟2~3

js實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function insertionSort(iArr) {
var oArr = [iArr[0]];
var n = iArr.length;
// 從左邊開始,每次拿一個與已排列好的數組進行比較
for (var i = 1; i < n; i++) {
for (var j = 0; j < i; j++) {
if (iArr[i] <= oArr[j]) {
// 若介於小於該元素,則插入其前方
oArr.splice(j, 0, iArr[i]);
break;
} else if (j === i - 1) {
// 若比最後一個還大,則排在最右側
oArr.push(iArr[i]);
}
}
}
return oArr;
}

驗證

1
2
3
4
5
insertionSort([ 5, 2, 4, 6, 1, 3]);
// 輸出[1, 2, 3, 4, 5, 6]
 
insertionSort[ 5, 2, 12, 2, 134, 1, 3, 34, 4, 6, 1, 3]);
// 輸出[1, 1, 2, 2, 3, 3, 4, 5, 6, 12, 34, 134]

單數組插入排序


思路

這裏在一個數組中進行插入排序:spa

  1. 從第一個元素開始,該元素能夠認爲已經被排序
  2. 取出下一個元素,在已經排序的元素序列中從後向前掃描
  3. 若是該元素(已排序)小於新元素,將新元素插入該元素下一位置
  4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置,將新元素插入到該位置後
  5. 若無,則將新元素插入最左側
  6. 重複步驟2~5

js實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function insertionSort(iArr) {
var n = iArr.length;
// 從第一個元素開始,該元素能夠認爲已經被排序
for (var i = 1; i < n; i++) {
// 取出下一個元素,在已經排序的元素序列中從後向前掃描
for (var j = i - 1; j >= 0; j--) {
if (iArr[i] >= iArr[j]) {
// 若是該元素(已排序)小於新元素,將新元素插入該元素下一位置
iArr.splice(j + 1, 0, iArr.splice(i, 1)[0]);
break;
} else if (j === 0) {
// 若是已經是最小元素,則插入最左側
iArr.splice(j, 0, iArr.splice(i, 1)[0]);
}
}
}
return (iArr)
}

驗證

1
2
3
4
5
insertionSort([ 5, 2, 4, 6, 1, 3]);
// 輸出[1, 2, 3, 4, 5, 6]
 
insertionSort[ 5, 2, 12, 2, 134, 1, 3, 34, 4, 6, 1, 3]);
// 輸出[1, 1, 2, 2, 3, 3, 4, 5, 6, 12, 34, 134]
相關文章
相關標籤/搜索