標籤:快速排序 演算法
左軸演算、中軸演算、右軸演算
題目:
快速排序法(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;}