[7] 演算法之路 - 快速排序之3軸演算

來源:互聯網
上載者:User

標籤:快速排序   演算法   

左軸演算、中軸演算、右軸演算

題目:

快速排序法(quick sort)是目前所公認最快的排序方法之一(視解題的對象而定),雖然快速排序法在最差狀況下可以達O(n2),但是在多數的情況下,快速排序法的效率表現是相當不錯的。


快速排序 - 演算法

1、快速排序法的基本精神是在數列中找出適當的軸心,然後將數列一分為二

2、分別對左邊與右邊數列進行排序


左軸演算:

// 快速排序 - 左軸演算// 1. 附設兩個指標left/right,並設最左端的數為最初樞軸pivot// 2. 從右向左搜尋,找到第一個比pivot小的數,將其緩衝進樞軸位置// 3. 從左向右搜尋,找到第一個比pivot大的數,緩衝進上一個比pivot小的數的位置程式進入2.迴圈// 4. 最後一次交換後獲得的有效空位置為a[i] ,此時再將pivot賦值給a[i] 此時a[i]左邊的數比a[i]小,右邊的數比a[i]大//    再分別對其左邊與左邊進行快速排序int QuickSort2(int a[],int left,int right){if(left<right){int i = left,j=right,pivotloc=a[left];while(i < j){while(i<j && a[j]>=pivotloc) j--;if(i<j) a[i++]=a[j];while(i<j && a[i]<pivotloc)i++;if(i<j) a[j--]=a[i];}a[i]=pivotloc;QuickSort2(a,left,i-1);QuickSort2(a,i+1,right);}return 0;}
int QuickSort5(int a[],int left,int right){if(left<right){int i = left,j=right,pivotloc=a[left];while(i < j){while(i<j && a[i]<=pivotloc) i++;while(i<j && a[j]>pivotloc) j--;if(i<j){SWAPER(a[i],a[j]);i++;j--;}}if(a[j]<a[left]) {SWAPER(a[left],a[j]);}QuickSort5(a,left,j-1);QuickSort5(a,j,right);}return 0;}

中軸演算

// 快速排序int QuickSort3(int a[],int left,int right){int i,j,pivot;if(left<right){pivot=a[(left+right)/2];i=left-1;j=right+1;while(i<j){while(a[++i]<pivot) ;while(a[--j]>pivot) ;if(i<j) SWAPER(a[i],a[j]);}QuickSort3(a,left,i-1);QuickSort3(a,j+1,right);}return 0;}


右軸演算

// 快速排序演算// 1. 首先選擇最右邊的元素作為樞軸pivot// 2. 從左向右搜尋,尋找小於pivot的數,將其與左邊第一個未交換的元素交換// 3. 當搜尋到最右邊時,左邊已交換的數都比pivot小,而未交換的都比pivot大// 4. 將左邊的第一個未交換的元素與最右邊的pivot元素交換,並返回該未交換元素的索引// 此時i左邊的元素比i小,右邊的比i大// 程式進入.迴圈分別對0 →i -1  及最右邊的i+1→right進行遞迴(快速排序) 最終該序列會變為有序int Partition2(int a[],int left,int right){int i = left,j;int pivot=a[right];for(j=left;j<right;j++){if(a[j]<pivot){if(i!=j)SWAPER(a[i],a[j]);i++;}}if(i!=right)SWAPER(a[i],a[right]);return i;} int QuickSort4(int a[],int left,int right){int pivot;if(left<right){pivot=Partition2(a,left,right);QuickSort4(a,left,pivot-1);QuickSort4(a,pivot+1,right);}return 0;}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.