【排序算法】-快速排序Quick Sort

簡(jiǎn)介

快速排序,通過(guò)一趟掃描將要排序的數(shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

講解

設(shè)示例數(shù)組為:[5 2 7 1 4 9 8],

  1. 先把第一項(xiàng)"5"取出來(lái);
    用"5"依次與其余項(xiàng)進(jìn)行比較;
    如果比"5"小就放"5"前邊,[2 1 4] 都比"5"小,所以全部放到"5"前邊,[2 1 4] [5];
    如果比"5"大就放"5"后邊,[7 9 8]比"5"大,放到"5"后邊[5] [7 9 8];
    第一次排序完成后:
    排序前: [5 2 7 1 4 9 8]
    排序后: [2 1 4 5 7 9 8]
  • 對(duì)前半部分和后半部分分別進(jìn)行快速排序
    [2 1 4]重復(fù)第一步->
    排序后:[1] [2] [4]
    [7 9 8]重復(fù)第一步->
    排序后: [7] [9 8]
    現(xiàn)在的數(shù)組是這樣字的:[1 2 4 5 7 9 8]

  • 對(duì)[9 8]排序
    排序后:[8] [9]

排序完成啦:[1 2 4 5 7 8 9];

演示代碼

function quickSort(array,low,high){
    var tt =0;
    if(low<high){
        tt = partition(array,low,high);
        quickSort(array,low,tt-1);
        quickSort(array,tt+1,high);
    }
}
var partition = function(unsorted,left,right){
    var tem = unsorted[left];
    while(left<right){
        while(left<right && unsorted[right]>=tem){right--;}//從右邊開(kāi)始,找到第一個(gè)小于tem(所選基數(shù))的值
        unsorted[left] = unsorted[right];//把找到的數(shù)賦給unsorted[left],比如[4,3,1,5,9,7,2]會(huì)變?yōu)閇2,3,1,5,9,7,2]
        while(left<right && unsorted[left]<tem){left++;}//從左邊開(kāi)始,找到第一個(gè)大于tem的值
        unsorted[right]=unsorted[left];//把找到的數(shù)賦給unsorted[right],數(shù)組變作為[2,3,1,5,9,7,5]
        //循環(huán)
    }
    unsorted[left] = tem;//數(shù)組變作為[2,3,1,4,9,7,5],分割成功
    return left;//left=3;
}
window.onload=function(){
    var array = [4,3,1,5,9,7,2];
    quickSort(array,0,array.length-1);
    console.log(array);
}

這個(gè)復(fù)雜度我卻是計(jì)算不出來(lái)...依賴被測(cè)試的數(shù)組,好吧,網(wǎng)上說(shuō)是:n*logn,哪位大神告訴下怎么計(jì)算的- -

代碼執(zhí)行結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容