第十五周项目一
来源:互联网 发布: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;}运行结果:
知识点总结:
学习了快速排序、直接选择排序、堆排序三种排序方法
心得体会:
在学习的过程中,因为学的排序算法却来越多,我对这几种算法有一些混淆,但看了课本以后知道了排序算法共分几大类
有交换排序,包括冒泡排序和快速排序;有插入排序,包括直接插入排序和折半插入排序;有选择排序,包括简单选择排序和堆
排序。虽然方法都不同,但按照大的分类方向进行学习和记忆,就不会弄混了。
阅读全文
0 0
- 第十五周项目一
- 第十五周--项目一
- 第十五周项目一
- 第十五周项目一
- 第十五周项目一
- 第十五周项目一-工资项目1
- 第十五周项目一----数组类
- 第十五周项目一折腾二维数组
- 第十五周项目一-折腾二维数组
- 第十五周项目一 观察指针
- 第十五周项目一:内部寻内幕
- 第十五周项目三:OJ(一)
- 第十五周项目一数组的排序
- 第十五周项目一~验证算法
- 第十五周--项目一--验证算法
- 第十五周 项目一 验证算法
- 第十五周 项目一 验证算法
- 第十五周 项目一-验证算法
- [自用门户]加密解密,每次生成的结果不一样(Base64Utils+RSAUtils)
- 查看和设置文件的格式
- PHP + 小程序开发过程
- 在阿里云CentOS 7.4下安装WSTMart开源商城系统
- 第十四周项目2 用哈希法组织关键字
- 第十五周项目一
- SqlServer 与 MySQL 语句对比区别
- O_NONBLOCK与O_NDELAY有何不同
- ISP与IAP的区别
- 高性能mysql(2)分析几种sql
- 《Appium学习中遇到的问题》之“运行脚本时报错:Activity used to start app doesn't exist or cannot be launched!”
- 目标检测 Faster R-CNN运行及实时性DEMO测试
- kubernetes 集群的安装部署
- SVN中的基本操作