第十五周项目一

来源:互联网 发布:unity3d 离线安装 编辑:程序博客网 时间:2024/06/05 19:27

【项目1 - 验证算法(2)】

/*            *烟台大学计算机与控制工程学院             *作    者:张雨萌        *完成日期:2017年12月7日              */     

         问题描述:用序列{57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7}作为测试数据,运行并本周视频中所讲过的算法对应 程序,观察运

                             行结果并深刻领会算法的思路和实现方法:

                           (4)快速排序;(5)直接选择排序;(6)堆排序;

         程序及代码:

                (4)快速排序(该算法以第一个元素为基准进行快速排序)

#include <stdio.h>#define MaxSize 20typedef 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;}
运行结果:


                (5)直接选择排序

#include <stdio.h>      #define MaxSize 20      typedef int KeyType;    //定义关键字类型      typedef char InfoType[10];      typedef struct          //记录类型      {          KeyType key;        //关键字项          InfoType data;      //其他数据项,类型为InfoType      } RecType;              //排序的记录类型定义      void SelectSort(RecType R[],int n)      {          int i,j,k,l;          RecType temp;          for (i=0; i<n-1; i++)           //做第i趟排序          {              k=i;              for (j=i+1; j<n; j++)   //在当前无序区R[i..n-1]中选key最小的R[k]                  if (R[j].key<R[k].key)                      k=j;            //k记下目前找到的最小关键字所在的位置              if (k!=i)               //交换R[i]和R[k]              {                  temp=R[i];                  R[i]=R[k];                  R[k]=temp;              }              printf("i=%d: ",i);              for (l=0; l<n; l++)                  printf("%d ",R[l].key);              printf("\n");          }      }      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");          SelectSort(R,n);          printf("排序后:");          for (i=0; i<n; i++)              printf("%d ",R[i].key);          printf("\n");          return 0;      }   
运行结果:

               (6)堆排序

#include <stdio.h>#define MaxSize 20typedef int KeyType;    //定义关键字类型typedef char InfoType[10];typedef struct          //记录类型{    KeyType key;        //关键字项    InfoType data;      //其他数据项,类型为InfoType} RecType;              //排序的记录类型定义//调整堆void sift(RecType R[],int low,int high){    int i=low,j=2*i;                        //R[j]是R[i]的左孩子    RecType temp=R[i];    while (j<=high)    {        if (j<high && R[j].key<R[j+1].key)  //若右孩子较大,把j指向右孩子            j++;                                //变为2i+1        if (temp.key<R[j].key)        {            R[i]=R[j];                          //将R[j]调整到双亲结点位置上            i=j;                                //修改i和j值,以便继续向下筛选            j=2*i;        }        else break;                             //筛选结束    }    R[i]=temp;                                  //被筛选结点的值放入最终位置}//堆排序void HeapSort(RecType R[],int n){    int i;    RecType temp;    for (i=n/2; i>=1; i--) //循环建立初始堆        sift(R,i,n);    for (i=n; i>=2; i--) //进行n-1次循环,完成推排序    {        temp=R[1];       //将第一个元素同当前区间内R[1]对换        R[1]=R[i];        R[i]=temp;        sift(R,1,i-1);   //筛选R[1]结点,得到i-1个结点的堆    }}int main(){    int i,n=10;    RecType R[MaxSize];    KeyType a[]= {0,6,8,7,9,0,1,3,2,4,5};//a[0]空闲,不作为关键字    for (i=1; i<=n; i++)        R[i].key=a[i];    printf("排序前:");    for (i=1; i<=n; i++)        printf("%d ",R[i].key);    printf("\n");    HeapSort(R,n);    printf("排序后:");    for (i=1; i<=n; i++)        printf("%d ",R[i].key);    printf("\n");    return 0;}
运行结果:



知识点总结:

        学习了快速排序、直接选择排序、堆排序三种排序方法

心得体会:

       在学习的过程中,因为学的排序算法却来越多,我对这几种算法有一些混淆,但看了课本以后知道了排序算法共分几大类

       有交换排序,包括冒泡排序和快速排序;有插入排序,包括直接插入排序和折半插入排序;有选择排序,包括简单选择排序和堆

       排序。虽然方法都不同,但按照大的分类方向进行学习和记忆,就不会弄混了。

原创粉丝点击