快速排序(QuickSort)

快速排序的基本思想:
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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章