排序算法主要用于元素的數(shù)組排序,常見的排序算法有冒泡排序,選擇排序,插入排序,希爾排序,快速排序,歸并排序等,這些排序算法都可以用JavaScript去實現(xiàn)。下面的排序算法都可以假設是從小到大排序,從大到小可以相應進行轉換。
冒泡排序
冒泡排序的思想是從頭遍歷要排序的數(shù)組,比較相鄰的兩個數(shù)字,如果前面位置的數(shù)字大于后面位置的數(shù)字那么就讓他們交換位置,否則不進行任何操作,遍歷完一次之后,最大的數(shù)字放到了數(shù)組后面,然后在從頭遍歷,進行同樣的操作, 就可以將第二大的數(shù)放到倒數(shù)第二個位置,依次進行下去,直到所有的數(shù)排好位置為止,冒泡排序實現(xiàn)的代碼如下
functon bubbleSort(arr) {
for (var i = 0; i < arr.length-1; i++) {
for (var j = 0; j < arr.length-1-i; j++) {
if (arr[j] > arr[j+1]) {
// 交換位置
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
return arr;
}
}
選擇排序
選擇排序的基本思想是先找到數(shù)組中最小的元素,將它和數(shù)組的第一個元素交換位置,再找到數(shù)組中第二小的元素,將它和數(shù)組的第二個元素交換位置,依次進行下去,直到整個數(shù)組排好序為止。選擇排序代碼實現(xiàn)如下:
functon selectSort(arr) {
for (var i = 0; i < arr.length-1; i++) {
var min = arr[i];
for (var j = i+1; j < len; j++) {
if (arr[j] < min) {
var temp = min;
min = arr[j];
arr[j] = temp;
}
arr[i] = min;
}
}
return arr;
}
插入排序
插入排序的基本思想是將一個記錄(數(shù))插入到已排好序的有序數(shù)列中的適當位置。插入排序的代碼實現(xiàn)如下:
function insertSort(arr) {
for (var i = 1; i < arr.length; i++) {
var key = arr[i];
for (var j = i-1; j >= 0; j--) {
if (arr[j] > key) {
arr[j + 1] = arr[j];
} else {
arr[j + 1] = key;
}
}
}
return arr;
}
希爾排序
希爾排序又稱“縮小增量排序”,是在直接插入排序算法上進行改進的,它的基本思想是先將整個待排序序列分割成若干子序列,分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序。因為插入排序在對幾乎已經(jīng)排好序的數(shù)據(jù)操作時,效率高。
希爾排序的步驟是:首先取一個小于序列長度的整數(shù)d1作為增量,對序列從頭開始把所有距離為d的元素放在同一個分組中,現(xiàn)在各組內進行直接插入排序;然后去第二個增量d2(小于d1),進行同樣的操作,直到增量為1,即對已經(jīng)基本有序的序列進行插入排序。希爾排序代碼實現(xiàn)如下:
function shellSort(arr, dk) {
for (var d = dk/2; d > 0; d /= 2) {
for (var j = d; j < n; j++) {
if (arr[j] < arr[j-d]) {
var temp = arr[j];
var k = j - d;
while (k >= 0 && arr[k] > temp) {
arr[k + d] = arr[k];
k -= d;
}
arr[k + d] = temp;
}
}
}
}
快速排序
快速排序是一種分而治之的算法,它是冒泡排序的改進,基本思想是通過一趟排序將待排序列分割成獨立的兩部分,其中一部分的值都要比另一部分的值小,再分別對這兩部分繼續(xù)進行排序,直到整個序列有序。
快速排序的步驟是:首先從序列中選擇一個基準元素,假設為第一個元素,將列表分成兩部分,將所有小于基準值的元素放在基準值前面,所有大于基準值的元素放在基準值后面,再分別對這兩部分重復上面的步驟即可。代碼首先如下:
//key為基準值序號
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
} else {
var low = [];
var high = [];
var pivotkey = arr[0];
for (var i = 1; i < arr.length; i++) {
if (arr[i] <= pivotkey) {
low.push(arr[i]);
} else {
high.push(arr[i]);
}
}
}
return quickSort(low).concat(pivotkey, quickSort(high));
}
歸并排序
歸并的含義是將兩個或兩個以上的有序表組合成一個新的有序表。假設初始序列長度為n,首先,每個子序列的長度為1,然后前后兩兩歸并。得到若干個長度為2或者1的子序列,再兩兩歸并,如此重復,直至得到一個長度為n的的有序序列為止。