文章出自個人博客 https://knightyun.github.io/2019/05/01/js-sort,轉載請申明。
冒泡排序
冒泡排序即從頭到尾依次比較相鄰兩數的大小,不符合順序則交換位置,一直循環直到排序完成;
但方便程序編寫的做法是,從第一個到最後一個數,每個數分別與排在後面每個數進行比較和交換位置;
// 輸入值 arr 爲需要排序的數組
// 後面的代碼類似
function bubbleSort(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
let tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
return arr;
}
選擇排序
選擇排序與冒泡排序類似,從第一個數到最後一個數,分別與排在後面的每個數進行比較,只不過不用每次比較都交換位置,一次遍歷記錄一個最小值或最大值,此次遍歷結束後再與記錄的極值交換位置;
function selectSort(arr) {
for (let i = 0; i < arr.length; i++) {
let min = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j]) min = j;
}
let tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
return arr;
}
插入排序
插入排序即從第二個到最後一個數,每個數分別與排在前面的每個數進行比較,然後插入合適的位置使其有序;
function insertSort(arr) {
for (let i = 1; i < arr.length; i++) {
let tmp = arr[i];
for (let j = i; j > 0; j--) {
if (tmp < arr[j - 1]) {
arr[j] = arr[j - 1];
} else {
arr[j] = tmp;
break;
}
}
}
return arr;
}
快速排序
快速排序在數組中任選一個數(下面選第一個數)作中間值,然後將餘下的數分別與其比較,比中間值小則放到左邊,否則放右邊,然後再進行遞歸,將放在左邊和右邊的數組分別作爲新數組進行同樣的排序操作,直到數組不能再分,最後將所有排序結果合併;
function quickSort(arr) {
if (ar.length === 0) {
return arr;
} else {
let mid = arr[0],
left = [],
right = [];
for (let i = 1; i < arr.length; i++) {
if (arr[i] < mid) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).
concat(mid).
concat(quickSort(right));
}
}
歸併排序
歸併排序遞歸地將數組分割爲兩個部分(左數組與右數組),直到不能再分,然後再定義一個合併函數,負責將兩部分合併爲一個有序數組作爲返回值;
合併函數其實會是合併兩個有序的數組,合併方法便是分別將兩數組第一個數取出(刪除)放入返回數組中,至於兩個數先放哪一個,可以通過比較大小來確定;
function mergeSort(arr) {
if (arr.length < 2) {
return arr;
} else {
let mid = Math.ceil(arr.length / 2);
let left = arr.slice(0, mid);
let right = arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
}
function merge(left, right) {
let result = [];
while (left.length + right.length > 0) {
if (!left[0]) {
result = result.concat(right);
right = [];
} else if (!right[0]) {
result = result.concat(left);
left = [];
} else {
if (left[0] < right[0]) {
result = result.concat(left.shift());
} else {
result = result.concat(right.shift());
}
}
}
return result;
}