插入排序
排序問題
- 輸入:n個數的一個序列
<a1, a2, ..., an>
- 輸出:輸入序列的一個排列
<a1', a2', ..., an'>
,滿足a1' <= a2' <= ... <= an'
思路
插入排序的工作方式像許多人排序一手撲克牌:
- 左手為空,桌子上牌面向下
- 每次從桌子上拿走一張牌插入左手中正確的位置
- 為了找到正確位置,從右到左將它與已經在手中的每張牌進行比較,然后插入
- 重復步驟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]
|
單數組插入排序
思路
這里在一個數組中進行插入排序:
- 從第一個元素開始,該元素可以認為已經被排序
- 取出下一個元素,在已經排序的元素序列中從后向前掃描
- 如果該元素(已排序)小於新元素,將新元素插入該元素下一位置
- 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置,將新元素插入到該位置后
- 若無,則將新元素插入最左側
- 重復步驟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]
|