第十六週 項目1 -(4)驗證快速排序

/*     
*煙臺大學計控學院      
*作    者:臧新曉  
*完成日期:2016年12月16日  
*問題描述:用序列{57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7}作爲測試數據,驗證快速排序  
*/    
   
(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];    
 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[]={57,40,38,11,13,34,48,75,6,19,9,7};       
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;    
}  



知識點總結:

取一個元素爲基準,將該元素放在恰當位置,將它與所有的關鍵字比較,比他大的在後面,比他小的在前面。

學習心得:

理清排序的思路。




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