第十六周--项目1-验证算法(4)快速排序

来源:互联网 发布:李炎恢 javascript 编辑:程序博客网 时间:2024/05/16 19:33

问题描述及代码:

/*     *烟台大学计算机与控制工程学院      *作    者:刘春彤    *完成日期:2016年12月12日  *问题描述:用序列{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;    }   


运行结果:


知识点总结:

取一个元素为基准,将该元素放在恰当位置,将它与所有的关键字比较,比他大的在后面,比他小的在前面。


0 0
原创粉丝点击