实验项目名称:排序
实验目的和要求:
1.熟悉常用排序方法的特性。
2.应用排序方法解决具体问题。
实验原理和图例:
1. 序列(13,6,3,31,9,27,5,11)直接插入排序的过程如下:
初 始:【13】, 6, 3, 31, 9, 27, 5, 11
第1趟:【6, 13】, 3, 31, 9, 27, 5, 11
第2趟:【3, 6, 13】, 31, 9, 27, 5, 11
第3趟:【3, 6, 13,31】, 9, 27, 5, 11
第4趟:【3, 6, 9, 13,31】, 27, 5, 11
第5趟:【3, 6, 9, 13,27, 31】, 5, 11
第6趟:【3, 5, 6, 9, 13,27, 31】, 11
第7趟:【3, 5, 6, 9, 11,13,27, 31】
2. 序列 T=(21,25,49,25*,16,08)冒泡排序的具体实现过程如下:
初 始:21,25,49, 25*,16,08
第1趟:08,21,25, 49, 25*,16
第2趟:08,16 ,21,25, 49, 25*
第3趟:08,16 ,21,25, 25* ,49
第4趟:08,16 ,21,25, 25* ,49 —— 无交换,结束
第5趟:
初 始:【13】, 6, 3, 31, 9, 27, 5, 11
第1趟:【6, 13】, 3, 31, 9, 27, 5, 11
第2趟:【3, 6, 13】, 31, 9, 27, 5, 11
第3趟:【3, 6, 13,31】, 9, 27, 5, 11
第4趟:【3, 6, 9, 13,31】, 27, 5, 11
第5趟:【3, 6, 9, 13,27, 31】, 5, 11
第6趟:【3, 5, 6, 9, 13,27, 31】, 11
第7趟:【3, 5, 6, 9, 11,13,27, 31】
2. 序列 T=(21,25,49,25*,16,08)冒泡排序的具体实现过程如下:
初 始:21,25,49, 25*,16,08
第1趟:08,21,25, 49, 25*,16
第2趟:08,16 ,21,25, 49, 25*
第3趟:08,16 ,21,25, 25* ,49
第4趟:08,16 ,21,25, 25* ,49 —— 无交换,结束
第5趟:
3. 序列 T=(49,38,65,97,76,13,27)2-路归并排序的具体实现过程如下:
实验基本描述:
编写代码分别以直接插入排序、改进的冒泡排序和归并排序实现整数数组的排序,并分析时间复杂度。
实验步骤:
1.分别以直接插入排序、改进的冒泡排序和归并排序实现整数数组的排序,并分析时间复杂度;
2.在main函数中调用执行,输入并记录输出结果验证;
3.调试,记录出现的问题和最终的运行结果;
4.上交电子作业、填写实验报告。
2.在main函数中调用执行,输入并记录输出结果验证;
3.调试,记录出现的问题和最终的运行结果;
4.上交电子作业、填写实验报告。
——————————————————————————————————————————————
无需任何输入,代码可以显示排序的过程,第三种2-路归并排序没能显示排序过程(貌似也不可以啊)!
#include <iostream> #include<stdio.h> #include<math.h> using namespace std; int step0=0; //2路-归并排序记录步数 void print_arr1(int n,int a[],int step) //直接插入排序,输出数组a { if(step==0) printf("初始 : 【"); else printf("第%d趟: 【",step); for(int i=1;i<=n-1;i++) { printf("%2d",a[i]); if(i==step+1)printf("】,"); else printf(","); } if(step+1==n) printf("%d】\n",a[n]); else printf("%d\n",a[n]); } void print_arr2(int n,int a[],int step,int k) //冒泡排序,输出数组b { if(step==0) printf("初始 : "); else printf("第%d趟: ",step); for(int i=1;i<=n-1;i++) { printf("%02d",a[i]); if(i==step+1)printf(","); else printf(","); } if(k==0) printf("%02d ——无交换,结束\n第5趟:\n",a[n]); else printf("%02d\n",a[n]); } void print_arr3(int n,int a[]) //2-路归并排序,输出数组c { if(step0==0) {printf("初始关键字: ");step0=1;} else printf("%d趟输出数组为: ",step0++); // int i; for(i=1;i<=n-1;i++) { printf("%02d,",a[i]); } printf("%02d\n",a[n]); } void InsertSort(int a[],int n) { int i,j,flag,step=0; //flag 表示哨兵 print_arr1(n,a,step); for(i=2;i<=n;i++) { if(a[i]<a[i-1]) //小于时考虑放入子序列中的位置 { flag=a[0]=a[i]; //设置监视哨 a[i]=a[i-1]; for(j=i-2;flag<a[j];--j) { a[j+1]=a[j]; } a[j+1]=flag; } print_arr1(n,a,++step); } } void BubbleSort(int b[],int n) { int i,j,k=1,step=0; print_arr2(n,b,step,k); for(i=n;i>=2;i--) { k=0; for(j=n-1;j>=1;j--) { if(b[j]>b[j+1]) { k=1;swap(b[j],b[j+1]); } } print_arr2(n,b,++step,k); if(k==0) break; } } void Merge(int c[],int d[],int s,int m,int t) { int i=s,j,k=s; for(i=s,j=m+1;i<=m&&j<=t;++k) { if(c[i]<c[j]) d[k]=c[i++]; else d[k]=c[j++]; } while(i<=m) { d[k++]=c[i++]; } while(j<=t) d[k++]=c[j++]; for(i=s;i<=t;i++) //将数组d中的结果保存到c中,不然下次排序时c数组仍是没有更改的 c[i]=d[i]; } void MergingSort(int c[],int d[],int s,int t) { if(s==t) d[s]=c[s]; else { int m=(s+t)/2; MergingSort(c,d,s,m); MergingSort(c,d,m+1,t); Merge(c,d,s,m,t); //将c数组排序归并到数组d中,然后c数组 复制d数组 print_arr3(7,d); //弱化版输出,将不按照 } return ; } int main() { int i,j,n; printf("1.InsertSort:\n"); int a[]={0,13,6,3,31,9,27,5,11}; n=8; printf("序列(13,6,3,31,9,27,5,11)直接插入排序的过程如下:\n"); InsertSort(a,n); printf("\n2.BubbleSort: \n"); int b[]={0,21,25,49,25,16,8}; printf("序列 T=(21,25,49,25,16,08)冒泡排序的具体实现过程如下:\n"); n=6; BubbleSort(b,n); printf("\n3.ArrangeSort: \n"); int c[]={0,49,38,65,97,76,13,27}; int d[]={0,49,38,65,97,76,13,27}; printf("序列 T=(49,38,65,97,76,13,27)2-路归并排序的具体实现过程如下:\n"); n=8; MergingSort(c,d,1,8); return 0; }