常見排序演算法基於JS的實現

2022-09-02 12:51:11 字數 3282 閱讀 4125

一:氣泡排序

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...