JS排序算法之希爾排序與快速排序?qū)崿F(xiàn)方法
本文實(shí)例講述了JS排序算法之希爾排序與快速排序?qū)崿F(xiàn)方法。分享給大家供大家參考,具體如下:
希爾排序:
定義一個(gè)間隔序列,例如是5,3,1。第一次處理,會(huì)處理所有間隔為5的,下一次會(huì)處理間隔為3的,最后一次處理間隔為1的元素。也就是相鄰元素執(zhí)行標(biāo)準(zhǔn)插入排序。
在開始最后一次處理時(shí),大部分元素都將在正確的位置,算法就不必對(duì)很多元素進(jìn)行交換,這是比插入元素高級(jí)的地方。
時(shí)間復(fù)雜度O(n*logn)
function shellSort(){
var N=arr.length;
var h=1;
while(h<N/3){
h=3*h+1;//設(shè)置間隔
}
while(h>=1){
for(var i=h; i<N; i++){
for(j=i; j>=h && arr[j]<arr[j-h]; j-=h){
swap(arr, j, j-h);
}
}
h=(h-1)/3;
}
}
function swap(array, i, j){//兩個(gè)數(shù)調(diào)換
var temp =array[j];
array[j]=array[i];
array[i]=temp;
}
快速排序:
通過遞歸的方式將數(shù)據(jù)依次分解成包含較小元素和較大元素的不同子序列,不斷重復(fù)這個(gè)步驟,直到所有數(shù)據(jù)都是有序的。
選一個(gè)基準(zhǔn)值,小于基準(zhǔn)值的放一個(gè)數(shù)組里面。大于基準(zhǔn)值的放一個(gè)數(shù)組里面。
時(shí)間復(fù)雜度O(n*logn)
function quickSort(arr){
if(arr.length==0){
return [];
}
var left=[];
var right=[];
var p=arr[0];
for(var i=1; i<arr.length; i++){
if(arr[i]<p){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
return quickSort(left).concat(p,quickSort(right));
}
快速排序適合用于大型數(shù)據(jù)集合,在處理小數(shù)據(jù)集合反而性能會(huì)下降。
PS:這里再為大家推薦一款關(guān)于排序的演示工具供大家參考:
在線動(dòng)畫演示插入/選擇/冒泡/歸并/希爾/快速排序算法過程工具:
http://tools.jb51.net/aideddesign/paixu_ys
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
30分鐘快速實(shí)現(xiàn)小程序語(yǔ)音識(shí)別功能
最近需要在小程序上實(shí)現(xiàn)語(yǔ)音識(shí)別,將需要用到的功能都總結(jié)下,供大家參考。語(yǔ)音識(shí)別用的是科大訊飛,文中給出了詳細(xì)的實(shí)現(xiàn)方法介紹,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
json對(duì)象與數(shù)組以及轉(zhuǎn)換成js對(duì)象的簡(jiǎn)單實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇json對(duì)象與數(shù)組以及轉(zhuǎn)換成js對(duì)象的簡(jiǎn)單實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2016-06-06
深入了解JavaScript中邏輯賦值運(yùn)算符的應(yīng)用
邏輯賦值是對(duì)現(xiàn)有數(shù)學(xué)和二進(jìn)制邏輯運(yùn)算符的擴(kuò)展。我們先復(fù)習(xí)一下,然后看看把它們結(jié)合在一起能得到什么,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-11-11
JS實(shí)現(xiàn)固定在右下角可展開收縮DIV層的方法
這篇文章主要介紹了JS實(shí)現(xiàn)固定在右下角可展開收縮DIV層的方法,右下角的div層可實(shí)現(xiàn)收縮與展開的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02
js閉包所用的場(chǎng)合以及優(yōu)缺點(diǎn)分析
這篇文章主要介紹了js閉包所用的場(chǎng)合以及優(yōu)缺點(diǎn)分析,十分的詳細(xì)使用,有需要的小伙伴可以參考下。2015-06-06
JavaScript實(shí)現(xiàn)簡(jiǎn)單的數(shù)字倒計(jì)時(shí)
這里給大家總結(jié)了一些比較常用的javascript實(shí)現(xiàn)的倒計(jì)時(shí)功能的代碼,非常的實(shí)用,有需要的小伙伴可以參考下。2015-05-05

