概括
快速排序(Quick Sort)是由冒泡排序改進得到的,冒泡排序過程中,只對相鄰的兩個記錄進行比較,每次只能消除一個逆序,而快速排序方法中的一次交換就可以消除多個逆序。
在待排序的n個記錄中,任取一個一個記錄(本文采用取第一個記錄)作爲支點pivot,經過一趟排序後把所有小於pivot的記錄交換到前面,把所有關鍵字大於等於pivot的記錄交換到後面,然後再對pivot左右兩個子區間遞歸即可。
*下面 以{7,5,9,8,1,2,8,6}爲例。 *
示例第一趟
將left的起始值賦給pivot。
先從最右邊開始遍歷,當right所處位置的值小於pivot時停止right的移動,將該位置的值賦給left。
此時right已經停止,我們開始移動left,當left所處位置的值大於等於pivot時停止left的移動,並將其賦給right。
接着再次從right位置開始遍歷,反覆操作…
最終,循環結束,left等於right,我們把pivot的值填入該位置,然後我們分割這個集合,對兩個子集合進行遞歸。
C語言代碼如下:
#include<stdio.h>
int arr[]={7,5,9,8,1,2,8,6};
int getpivot(int left,int right){ //每個循環的條件都是left<right
int pivot=arr[left];//把最左側的值賦給支點
while(left<right){
while(arr[right]>=pivot&&left<right) right--;
arr[left]=arr[right];
while(arr[left]<pivot&&left<right) left++;
arr[right]=arr[left];
}
arr[right]=pivot;// 這裏left==right 所以都可以 下同
return left;
}
void quicksort(int left,int right)
{
if(left<right){
int pivot=getpivot(left,right);//找中間位置左右分割
quicksort(left,pivot-1);//處理左邊,這裏是一個遞歸的過程
quicksort(pivot+1,right);//處理右邊 ,這裏是一個遞歸的過程
}
}
int main(void)
{
int i;
quicksort(0,7);
for(i=0;i<8;i++)
printf("%d ",arr[i]);
return 0;
}
有錯的話還望各位大佬指教~~~~~~
文字摘抄自嚴蔚敏《數據結構》