溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

一種遞歸實現(xiàn)的快速排序精講

發(fā)布時間:2020-07-11 22:37:38 來源:網(wǎng)絡(luò) 閱讀:631 作者:小沄 欄目:開發(fā)技術(shù)

簡介:

快速排序是個“綜合素質(zhì)”較好的排序,比如javaSE中的Arrays.sort()實現(xiàn)原理,也是用的是快速排序思想。下面就看看一種快速排序的遞歸實現(xiàn)方式


要點:

1,分治思想,把問題劃分成可以與本問題處理方式相同的若干子問題,使用遞歸來解決。

   如排序問題,可以

    (1)把原數(shù)組A[p,q](原問題)劃分成三個部分 :較小部分A[p,m-1]  中間元素x=A[m]  較大部分A[m+1,q] 

          這樣把部分當做一個整體看待是有序的A[p,m-1] <  A[m]  <  A[m+1,q]

    (2)同理,無論是較小部分還是較大部分都可以繼續(xù)按(1)操作繼續(xù)劃分得更細,直到每個部分的元素

          被劃分得只有單個元素,原數(shù)組之間每個元素就有序了

特征:

1,快速排序是原址排序,子問題解決的時候,不需要整體再次合并排序結(jié)果

2,遞歸調(diào)用在非常的數(shù)據(jù)的時候可能會發(fā)生棧溢出(遞歸深度太大)

難點:

   如何劃分成相對有序的三個部分?

      思路:

         (1)在原數(shù)組的某個好識別的位置取出一個數(shù)做中間元素x(部分2)。(一般取數(shù)組末元素,如x=A[q])

         (2)采取一個位置變量i來左劃分界線,保證i上和i的左邊都是小部分元素(部分1)。

            (i的初始位置應(yīng)當在問題范圍的前一個位置,因為此時還沒開始劃分)

         (3)除了x元素,循環(huán)取出原數(shù)組中的每個元素A[j]與x做比較

             遇到不大于中間元素x要收集到界線上:

                 原界線i右移一個,此時i指向的元素是不確定性質(zhì)的元素,

                 不確定元素和已經(jīng)遇到的確定的小部分元素A[j]交換位置。(不確定換確定)

             遇到大于中間元素的,界線i不動,j繼續(xù)向右掃描(i和j之間的定是大部分元素,部分3)

         (4)讓中間元素交換到真正位置。一遍循環(huán)后,可以分出 小部分 和 大部分,

              此時只要在界線的右一個(即大部分中的某個元素)與中間元素交換即可讓劃分的三個部分滿足排序關(guān)系。




圖片描述:

一種遞歸實現(xiàn)的快速排序精講


代碼描述:


void quicklySort(int *arr , int start , int last){

    int mid;

    if(start<last){

        mid = partition(arr, start, last);//劃分子問題

        quicklySort(arr, start , mid-1);//解決左邊部分

        quicklySort(arr, mid+1, last);//解決右邊部分

    }

}


int partition(int *arr, int start, int last){

    int x = arr[last];//取本段數(shù)組最后一個元素,稍后使其成為劃分好的中間元素

    int i=0,j=0;

    i=start-1;//使用i來控制兩個部分的分界,初始值在子問題范圍的前一個

    for(j=start;j<= last-1; j++){

        if(arr[j]<= x){//如果j走過的值是屬于較小部分

           ++i;//較小部分分界線多收集一個空間

           swap(arr[i],arr[j]);//把屬于較小部分的值交換到這個空間(原址排序)

        }

        //如果是較大部分,讓j繼續(xù)向后滑行

    }

    swap(arr[i+1],arr[last]);//把選擇參照的值交換到小部分和大部分之間

    return i+1;//返回劃分好的中間位置

}




向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI