快速排序和歸并排序的js實(shí)現(xiàn)

還記得以前學(xué)數(shù)據(jù)結(jié)構(gòu)與算法課程的時候,開篇就有些句話”程序=算法+ 數(shù)據(jù)結(jié)構(gòu)“
現(xiàn)在慢慢的發(fā)現(xiàn)算法是一名程序員必不可少的技能,之前我和大多數(shù)前端er一樣,覺得算法在前端使用的非常少,沒必要學(xué)習(xí)算法,如果我們只局限現(xiàn)于前端,那么們的目光也太短淺了。

快速排序

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:選準(zhǔn)一個基數(shù),通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個排序過程以遞歸進(jìn)行,以此達(dá)到整個數(shù)據(jù)變成有序

 function quicksort(a,left,right){
     if(left>right){ //一定要有這個判斷,因?yàn)橛羞f歸left和i-1,若沒有這個判斷條件,該函數(shù)會進(jìn)入無限死錯位遞歸
       return;
   }
  
     var i=left,
     j=right,
     jizhun=a[left]; //基準(zhǔn)總是取序列開頭的元素
  
   while(i!=j){ //該while的功能為每一趟進(jìn)行的多次比較和交換最終找到位置k。當(dāng)i==j時意味著找到k位置了
       while(a[j]>=jizhun&&i<j){j--} //只要大于等于基準(zhǔn)數(shù),j指針向左移動直到小于基準(zhǔn)數(shù)才不進(jìn)入該while。i<j的限制條件也是很重要,不然一直在i!=j這個循環(huán)里,j也會越界
       while(a[i]<=jizhun&&i<j){i++} //只要小于等于基準(zhǔn)數(shù),i指針向右移動直到大于基準(zhǔn)數(shù)才不進(jìn)入該while。等于條件也是必要的,舉例[4,7,6,4,3]驗(yàn)證一下是兩個4交換
       if(i<j){  //如果i==j跳出外層while
         t=a[i];
         a[i]=a[j];
         a[j]=t 
       } 
    } 
 
   a[left]=a[i];//交換基準(zhǔn)數(shù)和k位置上的數(shù)
   a[i]=jizhun;
 
   quicksort(a,left,i-1);
   quicksort(a,i+1,right);
 }
 
 var array=[4,7,2,8,3,9,12];
 quicksort(array,0,array.length-1);//排完序后再看array是[2, 3, 4, 7, 8, 9, 12]

歸并排序

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表

function mergeSort(arr) {
    const length = arr.length;
    if (length === 1) { //遞歸算法的停止條件,即為判斷數(shù)組長度是否為1
        return arr;
    }
    const mid = Math.floor(length / 2);
   
    const left = arr.slice(0,  mid);
    const right = arr.slice(mid, length);
  
    return merge(mergeSort(left), mergeSort(right)); //要將原始數(shù)組分割直至只有一個元素時,才開始?xì)w并
}

function merge(left, right) {
    const result = [];
    let il = 0;
    let ir = 0;

    //left, right本身肯定都是從小到大排好序的
    while( il < left.length && ir < right.length) {
        if (left[il] < right[ir]) {
            result.push(left[il]);
            il++;
        } else {
            result.push(right[ir]);
            ir++;
        }
        
    }

    //不可能同時存在left和right都有剩余項(xiàng)的情況, 要么left要么right有剩余項(xiàng), 把剩余項(xiàng)加進(jìn)來即可
    while (il < left.length) { 
        result.push(left[il]);
        il++;
    }
    while(ir < right.length) {
        result.push(right[ir]);
        ir++;
    }
    return result;
}
console.log(mergeSort([2,9,1,8,3,]))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,303評論 0 52
  • 排序的基本概念 在計(jì)算機(jī)程序開發(fā)過程中,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個關(guān)鍵字進(jìn)行排序,排序完成的序列可用于快...
    Jack921閱讀 1,571評論 1 4
  • Ba la la la ~ 讀者朋友們,你們好啊,又到了冷鋒時間,話不多說,發(fā)車! 1.冒泡排序(Bub...
    王飽飽閱讀 1,898評論 0 7
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    printf200閱讀 852評論 0 0
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    閑云清煙閱讀 821評論 0 6

友情鏈接更多精彩內(nèi)容