一:氣泡排序
1. 原理
a. 從頭開始比較相鄰的兩個待排序元素,如果前面元素大於後面元素,就將二個元素位置互換
b. 這樣對序列的第0個元素到n-1個元素進行一次遍歷後,最大的乙個元素就「沉」到序列的最後位置(第n-1個位置,n為待排序元素個數)
c.排除此次排序最後面的那個元素(n=n-1),繼續對剩餘序列重複前面兩步
d. 當(n= n-1)=0時,排序完成
2. 具體實現
以如下待排序序列為例:
氣泡排序
到此,第一次冒泡完成,最大值7冒泡到最後面。
然後繼續對除最後元素(7)外的序列進行氣泡排序。具體實現如下:
/*** 氣泡排序
* @param arr - 整型陣列
* @returns ret - 排好序的陣列
*/function bubblesort(arr)
i++;
}// 每次冒泡完成後,將i復位
i = 0;
}return arr;
}// 基於qunit的測試
test('bubble-sort', function () );
二:選擇排序
1. 原理
a. 首先在待排序序列中找到最小元素,放入儲存有序序列中。同時從待排序序列中刪除這個元素
b. 繼續從未排序序列中找到最小元素,然後a步中的有序列序列中
c. 以此類推,直到待排序序列元素個數為0
2. 具體實現:
選擇排序
/*** 選擇排序
* @param arr
* @returns ret
*/function selectionsort(arr)
return ret;
}// qunit
test('selection-sort', function () );
三: 插入排序
1. 排序原理:
a. 從待排序序列第0個元素開始排序,該元素可以認為已經是有序的
b. 取出下乙個元素,在已經排序的元素序列中從後向左遍歷
c. 如果已排序元素大於新元素,將該元素移到下一位置
d. 重複步驟c,直到找到乙個已排序的元素,此元素不大於新元素;或者元素位於有有序序列開始位置
e. 將新元素插入到此元素後面
f. 重複步驟b~e,直接待排元素個數為0
2. 具體實現
插入排序
/*** 插入排序
* @param arr
* @returns ret
*/function insertionsort(arr)
}arr[j] = v;
}return arr;
}// qunit
test('insertion-sort', function () );
四:希爾排序
1. 排序原理:
a. 設定乙個間距d,將待排序序列分組
b. 對分組使用插入排序
c. 改變d, 再次分組
d. 再次對上面的分組使用插入排序
e. 重複上面的步驟,直至d為1,並進行最後一次插入排序,得到排好序的序列
2. 具體實現
希爾排序1
希爾排序2
希爾排序過程中,涉及到選擇一組間距序列,這個序列叫叫希爾增量。希爾增量的奧妙以後有時間再研究。
/*** 希爾排序
* @param arr
* @returns
*/function shellsort(arr)
// 對分組使用插入排序,同時改變希爾增量值,直到其為1,並進行最後一次插入排序,得到有序序列
// 第一次插入排序,都是可以將待排序序列排成有序序列的
// 不停運用插入排序,其實是減少了元素在排序過程中移動的次數
while (h >= 1)
arr[j] = v;
}h = (h - 1) / 3; // 從①可以保證,肯定能除盡的
}return arr;
}// qunit
test('shell-sort', function () );
五. 歸併排序
1. 排序原理:
歸併排序主要分兩步:
a. 分組
對待排序序列按二分法分成兩個小序列,並一直遞迴下去,直到序列長度為1(長度為1 的序列是有序的)
b. 合併
將排好序的陣列合併成有序數列,最後得到排序結果
2. 具體實現
歸併排序1
歸併排序2
// 歸併排序
function mergetsort(arr)
var leftarr = arr.slice(0, math.floor(arr.length / 2));
var rightarr = arr.slice(leftarr.length);
// 遞迴
return merge(mergetsort(leftarr), mergetsort(rightarr));
// 合併有序序列
function merge(arrleft, arrright) else
} else else
break;}}
return ret;}}
// qunit
test('merge-sort', function () );
六: 快速排序
1. 排序原理
a. 從序列中挑出乙個元素,稱為 "基準"(pivot),
b. 重新排序序列,所有元素比基準值小的元素擺放在基準前面,所有元素比基準值大的擺在基準後面
c. 把新得到的序列再通過上面的方法排序。當序列長度為1或0時結束遞迴
2. 具體實現
快速排序
// 快速排序
function quicksort(arr)
if(arr.length === 1)
for(; i < arr.length; i++) else
}return quicksort(leftarr).concat(pivot, quicksort(rightarr));
}// qunit
test('quick-sort', function () );
小結:本文把常見的排序演算法(冒泡,選擇,插入,希爾,歸併,快速排序)基於js實現了一遍,練習一下演算法,還是有助於提高程式設計思維的。比如求乙個陣列的最大值。我們知道可以這樣:
但是瀏覽器內部是怎麼實現的呢,又或者假設瀏覽器沒提供這個方法,我們自己怎麼做呢?其實通過一次向左冒泡就可以得到最小值:
常見排序演算法 JS實現
氣泡排序 bubblesort 每輪排序選出乙個最小或最大的元素再乙個個插入陣列 選擇排序 selectionsort this swap min,i 從未排序元素中挑出乙個元素挨個跟區域性有序的元素進行比較,找到對應位置插入即可 插入排序 insertsort this array j temp ...
js實現常見排序演算法
電腦配置 cpu amd x4 640 記憶體 巨集想 ddr3 1600mhz 8g 主機板 華擎 980de3 u3s3 r2.0 瀏覽器 chrome 79.0.3945.88 正式版本 64 位 時間測試函式 function testruntime fn 1.氣泡排序 2.選擇排序 3.插...
js實現常見的排序演算法
插入排序的實現 function insertsort2 arr arr j 1 temp 插入排序改進,判斷j 0 function insertsort2 arr arr j 1 temp 希爾排序 分割策略 縮小增量排序 折半插入 function shellsort arr arr k ga...