16周-項目(一)-快速排序

問題及代碼:


1.以第1個元素作爲基準

#include <stdio.h>
#define MaxSize 20
typedef int KeyType;    //定義關鍵字類型
typedef char InfoType[10];
typedef struct          //記錄類型
{
    KeyType key;        //關鍵字項
    InfoType data;      //其他數據項,類型爲InfoType
} RecType;              //排序的記錄類型定義
void QuickSort(RecType R[],int s,int t) //對R[s]至R[t]的元素進行快速排序
{
    int i=s,j=t;
    RecType tmp;
    if (s<t)                //區間內至少存在兩個元素的情況
    {
        tmp=R[s];           //用區間的第1個記錄作爲基準
        while (i!=j)        //從區間兩端交替向中間掃描,直至i=j爲止
        {
            while (j>i && R[j].key>=tmp.key)
                j--;        //從右向左掃描,找第1個小於tmp.key的R[j]
            R[i]=R[j];      //找到這樣的R[j],R[i]"R[j]交換
            while (i<j && R[i].key<=tmp.key)
                i++;        //從左向右掃描,找第1個大於tmp.key的記錄R[i]
            R[j]=R[i];      //找到這樣的R[i],R[i]"R[j]交換
        }
        R[i]=tmp;
        QuickSort(R,s,i-1);     //對左區間遞歸排序
        QuickSort(R,i+1,t);     //對右區間遞歸排序
    }
}
int main()
{
    int i,n=10;
    RecType R[MaxSize];
    KeyType a[]= {6,8,7,9,0,1,3,2,4,5};
    for (i=0; i<n; i++)
        R[i].key=a[i];
    printf("排序前:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    QuickSort(R,0,n-1);
    printf("排序後:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    return 0;
}


2.以中間位置的元素作爲基準

#include <stdio.h>
#define MaxSize 20
typedef int KeyType;    //定義關鍵字類型
typedef char InfoType[10];
typedef struct          //記錄類型
{
    KeyType key;        //關鍵字項
    InfoType data;      //其他數據項,類型爲InfoType
} RecType;              //排序的記錄類型定義
void QuickSort1(RecType R[],int s,int t) //對R[s]至R[t]的元素進行快速排序
{
    int i=s,j=t;
    KeyType pivot;
    RecType tmp;
    pivot = R[(s+t)/2].key; //用區間的中間位置的元素作爲關鍵字
    if (s<t)                //區間內至少存在兩個元素的情況
    {
        while (i!=j)        //從區間兩端交替向中間掃描,直至i=j爲止
        {
            while (j>i && R[j].key>pivot)
                j--;        //從右向左掃描,找第1個小於基準的R[j]
            while (i<j && R[i].key<pivot)
                i++;        //從左向右掃描,找第1個大於基準記錄R[i]
            if(i<j)        //將前後的兩個失序元素進行交換
            {
                tmp=R[i];
                R[i]=R[j];
                R[j]=tmp;
            }
        }
        QuickSort1(R,s,i-1);        //對左區間遞歸排序
        QuickSort1(R,j+1,t);        //對右區間遞歸排序
    }
}
int main()
{
    int i,n=10;
    RecType R[MaxSize];
    KeyType a[]= {6,8,7,9,0,1,3,2,4,5};
    for (i=0; i<n; i++)
        R[i].key=a[i];
    printf("排序前:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    QuickSort1(R,0,n-1);
    printf("排序後:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    return 0;
}


輸出及結果:


分析:


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