快速排序(Quick Sort)附C語言代碼

概括

快速排序(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;
}

有錯的話還望各位大佬指教~~~~~~
文字摘抄自嚴蔚敏《數據結構》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章