5. 快速排序

來源:互聯網
上載者:User

標籤:標記   圖片   quick   避免   情況   就是   block   資料   i+1   

一、基本思想

通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以使整個序列有序。

在分割的過程中,樞紐元的選擇至關重要。原因如下:

  (1)兩部分資料是以樞紐元為分界點,小於等於樞紐元的數全部放在樞紐元的左邊,而大於等於樞紐元的數全部放在樞紐元的右邊;

  (2)一般選用左端、右端和中心位置上的三個元素的中值作為樞紐元,即三數取中法,它可以很大程度上避免分組“一邊倒”的情況。

 

二、三數取中

在快排的過程中,每一趟排序我們都要取一個元素作為樞紐值,以這個數字來將序列劃分為兩部分。

在此我們採用三數取中法,也就是取左端、中間、右端三個數,然後進行排序,將中間數作為樞紐值。

 

三、根據樞紐值進行分割

 

四、代碼

/* 快速排序 */ void QuickSort(int a[], int left, int right){if(left >= right)return;// 採用三數取中法,擷取樞紐元,並將其放在當前待處理序列末尾 DealPivot(a, left, right);int pivot = a[right-1];// pivot為樞紐元,而其下標為right-1 int i = left, j = right - 1;// 設定兩個遊標,用以標記待排序區間// 當 i = j 時,已經尋找完整個區間了 while(i != j) {while(i < j && a[i] <= pivot) // 因為樞紐元在右邊,所以從左邊開始 ++i;while(i < j && a[j] >= pivot)--j;if(i < j)swap(a[i], a[j]);}// 此時 i = j swap(a[i], a[right-1]);sort(a, left, i-1);sort(a, i+1, right);}// 處理樞紐元 void DealPivot(int a[], int left, int right){int mid = (left + right) / 2;if(a[left] > a[mid])swap(a[left], a[mid]);if(a[left] > a[right])swap(a[left], a[right]);if(a[mid] > a[right])swap(a[mid], a[right]);swap(a[mid], a[right-1]);// 將樞紐元放到倒數第二個元素去,所以要先從左邊檢索 }

  

 

5. 快速排序

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.