快速排序的基本思想:
1.先從數列中取出一個數作爲基準數。
2.分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有一個數。
其中,每一趟快速排序的過程可以理解爲挖坑填數,過程如下:
1.i =left; j = right; 將基準數挖出形成第一個坑a[i]。
2.j–由後向前找比它小的數,找到後挖出此數填前一個坑a[i]中。
3.i++由前向後找比它大的數,找到後也挖出此數填到前一個坑a[j]中。
4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。
代碼如下:
//QuickSort.c
#include <stdio.h>
//打印數組
void PrintArray(int array[],int n)
{
int i;
for(i = 0;i < n;i++)
printf("%-3d",array[i]);
printf("\n");
}
//返回劃分後被定位的基準記錄的位置
int Partition(int array[],int left,int right)
{
int i,j,temp;
i = left;
j = right;
temp = array[i]; /*初始化,temp爲基準*/
do{
while((temp <= array[j]) && (i < j))
j--; /*從右往左查找第一個關鍵字小於temp記錄*/
if(i<j)
array[i++] = array[j]; /*交換array[i]與array[j]*/
/*array[i] = array[j];
i++;
*/
while((temp >= array[i]) && (i<j))
i++; /*從左向右查找第一個關鍵字大於temp記錄*/
if(i<j)
array[j--] = array[i];/*同上*/
}while(i != j);
array[i] = temp; /*基準temp已被最後定位*/
return i;
}
//快速排序,對array從left到right進行快速排序
void QuickSort(int array[],int left,int right)
{
int i;
if(left<right){ /*只有一個記錄或無記錄時無需排序*/
//對array[left]到array[right]劃分
i = Partition(array,left,right);
//遞歸處理左區間
QuickSort(array,left,i - 1);
//遞歸處理右區間
QuickSort(array,i + 1,right);
}
}
void main()
{
int array[8]={1,9,4,3,7,2,8,5};
QuickSort(array,0,7);
PrintArray(array,8);
}