本文章为课程设计全部内容
目录(根据自己的设计更改页数)
1、 任务设计……………………………………2
2、 代码说明……………………………………3
3、 代码清单……………………………………18
4、 代码测试……………………………………18
5、 课程设计总结……………………………19
一、任务设计
1、 设计题目
题目: 数据结构排序实践
2、 课程设计目的
目的:排序时计算机程序设计中的一种重要操作,其功能时按照记录集合中每个记录的关键字之间所存在递增或递减关系,将该集合中的记录次序重新排列。
3、 基本思想
插入排序:包括直接插入排序、折半插入排序、希尔(Shell)排序。将记录集合分为有序和无序俩个序列。从无序序列中任取一个记录,然后根据该记录的关键字大小在有序序列中查找一个合适的位置,使得该记录放入这个位置后,这个有序序列仍然保持有序。每插入一个记录称为一趟插入排序,经过多趟插入排序,使得无序序列中的记录全部插入到有序序列中,则排序完成。
交换排序:包括冒泡排序、快速排序。交换排序是通过交换记录中的位置来实现排序的。俩俩比较待排序记录的关键字,一旦发现俩个记录的次序与排序要求相逆则交换这俩个记录的位置,直到表中没有逆序的记录存在为止。
选择排序:包括直接选择排序、堆排序。每一趟从待排序记录中选取关键字最小的记录,并顺序放在已排好序的记录序列的最后,直到全部记录排序完成为止。
4、 使用编译环境
软件:Visual C++ 2010 Express
5、 主要功能:
使用多种方法进行排序(从小到大)。
二、代码说明
Interposition插入排序、Binary_insert折半插入排序、Bubbing冒泡排序、Speediness快速排序、Select/选择排序、Pile堆排序、select选择、MAXSIZE记录类型数组、key关键字项、data其他数据项、RecordType记录类型、D_Insert直接插入排序函数、B_InsertSort折半插入排序函数、BubbleSort冒泡排序函数、Partition划分算法、QuickSort快速排序函数、SelectSort选择排序函数、
三、代码清单
#include #define MAXSIZE 30 typedef struct { int key;//关键字项 char data;//其他数据项 }RecordType;//记录类型 //插入排序 void D_Insert(RecordType R[],int n) { //对n个记录序列R[1]~R[n]进行直接插入排序 int i,j; for(i=2;i<=n;i++) //进行n-1趟排序 if(R[i].key {//R[i].key小于R[i-].key时,需将R[i]插入到有序序列R[1]~R[i-1]中 R[0]=R[i];//设置查找监视哨R[0]并保存待插入记录R[i]值 j=i-1; //j定位于有序序列的最后一个记录R[i-1]处 while(R[j].key>R[0].key)//在有序序列中寻找R[i]的插入位置 {/将有序序列中关键字值大于R[i].key(即此刻的R[0].key)的所有Rj 由后向前顺序后移一个记录位置/ R[j+1]=R[j]; j–; } R[j+1]=R[0]; //将Ri插入到有序序列中应插位置上 } } void Interposition() { int i=1,j,x; RecordType R[MAXSIZE];//定义记录类型数组R printf(“输入所需排序的值直至-1结束:\n”); scanf("%d",&x); while(x!=-1) { R[i].key=x; scanf("%d",&x); i++; } printf(“输出表中记录的字:\n”); for(j=1;j printf("%4d",R[j].key); printf("\n排序\n"); D_Insert(R,i-1); //进行直接插入排序 printf(“输出直接插入排序后的结果:\n”); for(j=1;j printf("%4d",R[j].key); printf("\n"); } //折半插入排序 void B_InsertSort(RecordType R[],int n) { //对n个记录序列R[1]~R[n]进行折半插入排序 int i,j,low,high,mid; for(i=2;i<=n;i++) //进行n-1趟排序 { R[0]=R[i]; //设置查找监视哨R[0]并保存待插入记录的R[i]值 low=1,high=i-1;//设置初始化查找区间 while(low<=high)//寻找插入位置 { mid=(low+high)/2; if(R[0].key>R[mid].key) low=mid+1;//插入位置在右半区 else high=mid-1;//插入位置在左半区 } for(j=i-1;j>=high;j–) /high+1为插入位置,将R[i-1],R[i-2],…,R[high+1]顺序后移一个位置R[j+1]=R[j]/ R[high+1]=R[0];//将Ri放入应插入位置high+1 } } void Binary_insert() { int i=1,j,x; RecordType R[MAXSIZE];//定义记录类型数组R printf(“输入所需排序的值直至-1结束:\n”); scanf("%d",&x); while(x!=-1) { R[i].key=x; scanf("%d",&x); i++; } printf(“输出表中记录的关键字:\n”); for(j=1;j printf("%4d",R[j].key); printf("\n排序\n"); B_InsertSort(R,i-1); //进行折半插入排序 printf("\n输出折半插入排序后的结果:\n"); for(j=1;j printf("%4d",R[j].key); printf("\n"); } //冒泡排序 void BubbleSort(RecordType R[],int n) { //对R[1]~R[n]这n个记录进行冒泡排序 int i,j,swap; for(i=1;i { swap=0; //设置未发生交换标志 for(j=1;j<=n-i;j++) //R[1]~R[n-i]记录进行俩俩比较 if(R[j].key>R[j+1].key) //如果R[j].key大于R[j+1].key,则交换R[j]和R[j+1] { R[0]=R[j]; R[j]=R[j+1]; R[j+1]=R[0]; swap=1;//有交换发生 } if(swap==0) break; //本躺比较中未出现交换,则结束排序(序已排好) } } void Bubbing() { int i=1,j,x; RecordType R[MAXSIZE];//定义记录类型数组R printf(“输入你要进行排序的数字直到-1结束:\n”); scanf("%d",&x); while(x!=-1) { R[i].key=x; scanf("%d",&x); i++; } printf(“输出表中各记录的关键字:\n”); for(j=1;j printf("%4d",R[j].key); BubbleSort(R,i-1); //进行冒泡排序 printf("\n输出冒泡排序后的结果\n"); for(j=1;j printf("%4d",R[j].key); printf("\n"); } //快速排序 int Partition(RecordType R[], int i, int j)//划分算法 { //对R[i]~R[j], 以R1为基准记录进行划分并返回划分后R[i]的正确位置 R[0]=R[i]; //暂存基准记录R[i]于R[0] while(i { while (i=R[0].key) //(从右向左扫描查找第一个关键字小于R[0].key时将R[0].key的记录R[j] j–; if(i { R[i]=R[j]; i++; } while (i //从左到右扫描查找第一个关键字大于R[0].key的记录R[i] i++; if(i { R[j]=R[i]; j–; } } R[i]=R[0];//将基准记录R[O]送入最终(指排好序时)应放置的位置 return i; //返回基准记录R[O]最终放置的位置 } void QuickSort(RecordType R[], int s, int t) { //进行快速排序 int i; if(s { i=Partition(R,s,t);//i为基准记录的位置并由此将表分为R[s]~R[i - 1]和R[i + 1]~R[t]两部分 QuickSort(R,s,i-1);//对表R[s]~R[i-1]进行快速排序 QuickSort(R,i+1,t);//对表R[i+1]~R[t]进行快速排序 } } void Speediness() { int i=1,j,x; RecordType R[MAXSIZE];//定义记录类型数组R printf(“输入所需要排序的数据直到输入-1结束:\n”); scanf("%d",&x); while(x!=-1) { R[i].key=x; scanf("%d",&x); i++; } printf(“输出表中各记录的关键字:\n”); for(j=1;j printf("%4d",R[j].key); QuickSort(R,1,i-1); //进行快速排序 printf("\n输入快速排序后的结果:\n"); for (j=1;j printf("%4d", R[j].key); printf("\n"); } //选择排序 void SelectSort(RecordType R[], int n) { int i,j,k; for (i=1;i { k=i; //假设关键字最小的记录为第i个记录 for(j=i+1;j<=n;j++)//从第i个记录开始的n-i+1个无序记录中选出关键字最小的记录 if(R[j].key k=j; //保存最小关键字记录的存放位置 if (i!=k) //将找到的最小关键字记录与第i个记录交换 { R[0]=R[k]; R[k]=R[i]; R[i]=R[0]; } } } void Select() { int i=1,j,x; RecordType R[MAXSIZE]; //定义记录类型数组R printf(“输入需要排序的数据直到输入-1结束:\n”); scanf("%d", &x); while(x!=-1) { R[i].key = x; scanf("%d", &x); i++; } printf(“输出表中各记录的关键字:\n”); for (j = 1; j < i; j++) printf("%4d", R[j].key); printf("\n排序:\n"); SelectSort(R,i-1); //进行选择排序 printf("\n输出选择排序后的结果 : \n"); for (j = 1; j < i; j++) printf("%4d", R[j].key); printf("\n"); } //堆排序 void HeapAdjust(RecordType R[], int s, int t)//基于大根堆的堆排序 { /对R[s]~R[t]除R[s]外均满足堆的定义, 即只对Rs进行调整, 使R[s]为根的完全二叉树成为一个堆/ int i,j; R[0]=R[s]; //R[s]暂存于R[0] i=s; for(j=2i;j<=t;j=2j)//沿关键字较大的孩子向下调整, 先假定为左孩子 { if(j j = j + 1;//右孩子结点的关键字大则沿右孩子向下调整 if(R[0].key>R[j].key)//即已满足堆的定义, 故不再向下调整 break; R[i]=R[j];//将关键字大的孩子结点R[j]调整至双亲结点R[i] i=j; //定位于孩子结点继续向下调整 } R[i]=R[0];//找到满足堆定义的R[0](即R[s]放置位置i, 将R[s]调整于此 } void HeapSort(RecordType R[], int n) { //对R[1]~R[n]这n个记录进行堆排序 int i; for(i=n/2;i>0;i–) //将完全二叉树非终端结点按R[n/2,R[n/2-1,…, R[1]的顺序建立初始堆 HeapAdjust(R,i,n); for(i=n;i>1;i–) //对初始堆进行n-1趟堆排序 { R[0] = R[1]; //堆顶的R[1]与堆底的R[i]交换 R[1] = R[i]; R[i] = R[0]; HeapAdjust(R, 1, i - 1);//将未排序的前i-1个的点重新调整为堆 } } void Pile() { int i = 1,j,x; RecordType R[MAXSIZE]; //定义记录类型数组R printf(“输入需要排序的数据直到结束输入-1:\n”); scanf("%d",&x); while(x!=-1) { R[i].key=x; scanf("%d",&x); i++; } printf(“输出表中各记录的关键字:\n”); for(j=1;j printf("%4d",R[j].key); printf("\nSort:\n"); HeapSort(R,i-1); //进行堆排序 printf("\n输出堆排序后的结果:\n"); for(j=1;j printf("%4d",R[j].key); printf("\n"); } int main() { int select; //选择 //首界面 { printf("\n数据结构排序实践\n"); printf(" 1、插入排序\n"); printf(" 2、折半插入排序\n"); printf(" 3、冒泡排序\n"); printf(" 4、快速排序\n"); printf(" 5、选择排序\n"); printf(" 6、堆排序\n"); printf("***请选择(1-6)😊; scanf("%d",&select); getchar(); switch (select) { case 1:Interposition(); //插入排序 break; case 2:Binary_insert(); //折半插入排序 break; case 3:Bubbing(); //冒泡排序 break; case 4:Speediness(); //快速排序 break; case 5:Select(); //选择排序 break; case 6:Pile(); //堆排序 break; } } }
四、代码测试
1、测试数据
选项1:输入关键字8 9 5 6 4 2 3 19
选项2:输入关键字5 9 3 4 6 12 21 36 19 41
选项3:输入关键字5 3 6 1 2 9 19 21 12 23
选项4:输入关键字5 9 7 6 1 2 4 3 12 133 21
选项4:输入关键字5 12 2 3 4 1 6 9 8 7
选项4:输入关键字5 2 1 4 3 6 9 8 7 12 21 13
###2、测试结果
五、课程设计总结
虽然这次课程是那么短暂的俩周时间,我感觉到这些天我的所学胜过我这一学期所学,这次任务原则上是设计,其实就是一次大的作业,是让我对课本知识的巩固和对基本概念的熟悉和应用,使我做事的耐心和仔细程度得以提高。课程设计是培训学生运用本专业所学的理论知识和专业知识来分析解决实际问题的重要环节,是对所学知识的复习和巩固。因此,我们必须认真、谨慎、踏实、一步一步的完成设计。此次设计让我明白了一个很深刻的道理:团队精神固然很重要,但人往往还是要靠自己的努力,自己亲身去经历,这样自己的心里才会踏实, 学到的东西才会更多。