第14周項目1(4)- 驗證算法 快速排序

/*   
* Copyright(c) 2017,煙臺大學計算機學院   
* All rights reserved.   
* 文件名稱:cpp1.   
* 作    者:薛瑞琪   
* 完成日期:2017 年 12 月 13 日   
* 版 本 號:v1.0   
*   
* 問題描述: 用序列{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];
    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");
    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;
}




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