1. 程式人生 > >資料結構與演算法 (三) 快速排序

資料結構與演算法 (三) 快速排序

1.演算法思想

        快速排序的演算法思想又稱分割槽交換排序演算法該排序演算法使用分割法對排序檔案中的記錄進行排序

2.演算法原理

         從待排序記錄中任選一個記錄,以這個記錄的排序碼作為中心值 將其他所有記錄劃分成兩個部分,第一部分包括所有排序碼小於中心值得記錄 第二部分包括所有排序碼大於中心值得記錄 而其排序碼作為中心值的這個記錄,在排序後必然處在這兩部分的中間位置 對上述兩部分繼續採用同樣的方式進行處理, 直到每個部分為空或者只含有一個記錄為止 至此待排序檔案中的每個記錄都被放置到正確的排序位置

3.演算法實現

#include <stdio.h>
#include <stdlib.h>


enum boolean {FALSE,TRUE};
typedef enum boolean Bool;

#define TRUE 1
#define FALSE 0

#define Bool int

typedef int ElementType;

struct forSort
{
    ElementType key;
};

typedef struct forSort ForSort;

void InitForSort(ForSort *FS,int a)
{
    FS->key=a;
}




void QuikSort(ForSort A[],int low,int high)
{
    int i,j;
    ForSort temp;
    if(low>=high)
        return ;
    i=low;
    j=high;
    temp=A[i];
    while(i<j)
    {
        //從後往前進行比較,直到當前記錄的排序碼小於等於中心值
        while(i<j&&temp.key<A[j].key)
            j--;
        if(i<j)  //將排序碼小於等於中心值得記錄交換到前面當前空出的記錄位置
        {
            A[i++]=A[j]; //從前往後進行比較,直到當前記錄的排序碼大於中心值
        }
        while(i<j&& A[i].key<=temp.key)
            i++;
        if(i<j)
        {
            A[j--]=A[i];
        }
    }

    A[i]=temp; //找到中心值對應的記錄所在的位置寫入中心值對應的記錄
    QuikSort(A,low,j--); //遞迴處理排序碼小於等於中心值得那組記錄
    QuikSort(A,++i,high); //遞迴處理排序碼大於等於中心值得那組記錄
}

int main()
{
    int i;
    int A[8]= {28,13,72,85,39,41,6,20};

    QuikSort(A,0,8);

    for(i=0; i<8; i++)
    {
        printf("%d\n",A[i]);
    }

    return 0;
}