排序综合
输入对应的操作序号,计算机很快确定排序的方式并输出排出的顺序和所耗费的时间字样给用户,用户就可以继续输入选项进行下一步操作;这样,需要实现的第一个功能就很轻松的完成了。 //简单选择排序
简单选择排序:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换之,直至整个序列非递减。
int SelectMin(int a[],int i,int m)//简单选择排序 {
int p,n,t; t=a[i];
for(p=i+1;p {if(a[p] for(n=i,p=i;p {if(a[n]==t) break;} return n; //归并排序 假设初始序列含有n个记录,则可看成是n个有序子序列,每个子序列的长度为1,然后两两归并,得到「n/2」个长度为2或1的有序子序列;在两两归并,......,如此重复,直至得到一个长度为n的有序序列为止。 void Merge(RedType SR[], RedType TR[], int i, int m, int n) //2-路归并排序 { //将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n] int j, k; for (j = m + 1, k = i; i <= m&&j <= n; ++k) { } if (i <= m) while (k <= n&&i <= m) TR[k++] = SR[i++]; //将剩余的SR[i..m]复制到TR 7 if (SR[i].key < SR[j].key) TR[k] = SR[i++]; //将SR中的记录由小到大并入TR else TR[k] = SR[j++]; 西华大学理学院课程设计说明书 } if (j <= n) while (k <= n&&j <= n) TR[k++] = SR[j++]; //将剩余的SR[j..n]复制到TR void MSort(RedType SR[], RedType TR1[], int s, int t) { } int m; RedType * TR2; TR2 = new RedType[M + 1]; if (s == t) TR1[t] = SR[s]; else { } delete[]TR2; m = (s + t) / 2; // 将SR[s..t]平分为SR[s..m]和SR[m+1..t] MSort(SR, TR2, s, m); // 递归地将SR[s..m]归并为有序的TR2[s..m] MSort(SR, TR2, m + 1, t); // 将SR[m+1..t]归并为有序的TR2[m+1..t] Merge(TR2, TR1, s, m, t); // 将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t] //冒泡排序 冒泡排序:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换之,然后比较第二个记录和第三个记录的关键字;以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止,结果使得关键字最大的记录被安置到最后一个记录的位置上;然后继续进行直至整个序列有序。 //冒泡排序; 8 { int t; //定义整形数据t //建立冒泡排序结果保存文件; ofstream output(\冒泡排序.txt\start = clock(); //开始起泡排序算法执行时间计时 //执行起泡排序算法 for (j = 1; j < M + 1; j++) { for (int i = 1; i 排序综合 } if (a[i]>a[i + 1]) { } t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; finish = clock(); //终止冒泡排序算法执行时间计时 printf( \显示冒泡排序结果:\\n\ for (i = 1; i < M + 1; i++)//每个元素占6个字符,以空格隔开,每100个元素换行 保存排序后数组; { } output << setw(6) << a[i] << \if (i % 100 == 0) printf(\ for (i = 1; i < M + 1; i++)//每个元素占6个字符,以空格隔开,每10个元素换行输 出排序后数组; { } printf(\冒泡排序完成,结果已保存!\\n\ cout << setw(6) << a[i] << \if (i % 10 == 0) printf(\ cout << \冒泡排序消耗时间为: \秒\//输出起泡排序算法耗时(s); system(\ goto loop;//返回程序主菜单; } break; // 直接插入排序 9 西华大学理学院课程设计说明书 直接插入排序:先将序列中的第1个记录看成是一个有序的子序列,然后从第2个记录起逐个进行插入,直至整个序列变成关键字非递减有序序列为止,整个排序过程进行n-1趟插入。 int i,j; //直接插入排序; 10 { int i, j; Sqlist L; //声明结构体; //初始化结构体长度为0; L.length = 0; ofstream output(\直接插入排序.txt\建立直接插入排序结果保存文件; for (i = 1; i < M + 1; i++)//初始化直接插入排序结构体中的数据; { } start = clock(); //开始直接插入排序算法执行时间计时; //执行插入排序算法; L.r[i].key = a[i]; L.length++; for (i = 2; i <= L.length; ++i) { } if (L.r[i].key < L.r[i - 1].key) { } L.r[0] = L.r[i]; L.r[i] = L.r[i - 1]; for (j = i - 2; L.r[0].key < L.r[j].key; --j) L.r[j + 1] = L.r[j]; L.r[j + 1] = L.r[0]; finish = clock(); //结束直接插入排序算法执行时间计时; cout << \显示直接插入排序的结果:\ for (i = 1; i < M + 1; i++)//每个元素占6个字符,以空格隔开,每100个元素换行 排序综合 保存排序后数组; { } output << setw(6) << L.r[i].key << \if (i % 100 == 0) printf(\ for (i = 1; i < M + 1; i++)//每个元素占6个字符,以空格隔开,每10个元素换行输 出排序后数组; { } printf( \直接插入排序完成,结果已保存!\\n\ // cout << setw(6) << L.r[i].key << \if (i % 10 == 0) printf(\ cout << \直接插入排序消耗时间为 \秒\ 输出直接排序算法耗时(s); system(\ goto loop; //返回程序主菜单; } break; //快速排序 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 int Partition(Sqlist &L, int low, int high) //快速排序 { int pivotkey; L.r[0] = L.r[low]; //用子表的第一个记录作枢轴 pivotkey = L.r[low].key; //枢轴记录关键字 while (low < high) { while (low < high && L.r[high].key >= pivotkey) --high; 11