数据结构课程设计-排序算法演示系统 下载本文

各专业全套优秀毕业设计图纸

计算机学院

数据结构课程设计

题 目:数据结构排序算法演示系统 班 级: 姓 名: 学 号: 同组人姓名:

起 迄 日 期: 课程设计地点: 指导教师:

评阅意见: 成绩评定: 评阅人: 日期: 完成日期:2014年12月

目录

一、课程设计的目的 ................................... 1 二、设计内容和要求 ................................... 1 三、数据采取的结构 ................................... 1 四、功能模块详细设计 ................................. 1 4.1 详细设计思想 .................................. 2 4.1.1 冒泡排序 ................................. 5 4.1.2 快速排序 ................................. 7 4.1.3 直接插入排序 ............................. 9 4.1.4 希尔排序 ................................ 10 4.1.5 直接选择排序 ............................ 12 4.1.6 堆排序 .................................. 14 4.1.7归并排序 ................................ 17 五、总结或心得体会 .................................. 19

六、参考文献 ........................................ 20 七、附录 ............................................ 20

一. 设计目的

随着计算机技术的发展,各种排序算法不断的被提出。排序算法在计算机科学中有非常重要的意义,且应用很广泛。在以后的发展中排序对我们的学习和生活的影响会逐渐增大,很有必要学习排序知识。此次课程设计一方面使自己掌握排序的知识,另一方面锻炼一下团队合作开发系统的能力。

二. 设计内容和要求

功能要求:

(1)界面友好,易与操作。可采用菜单或其它人机对话方式进行选择。 (2)实现各种内部排序。包括直接插入排序,冒泡排序,直接选择排序,希尔排序,快速排序,堆排序,归并排序。

(3)待排序的元素的关键字为整数或(字符)。可用随机数据和用户输入数据作测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换以3次计)。

(1) 演示程序以人机对话的形式进行。每次测试完毕显示各种比较指标值的列

表,以便比较各种排序的优劣。

三. 本设计所采用的数据结构

typedef struct {

int key; }RecType;

四.功能模块详细设计

排序算法演示系统 冒泡排序快速排序直接插入排序希尔排序直接选择排序堆排序归并排序 - 1 -

4.1 详细设计思想

主函数:

#include #include #include

#define L 8 //排序元素个数 #define FALSE 0 #define TRUE 1 typedef struct {

int key; }RecType; RecType R[L]; int num; int sum;

int sun; //定义排序趟数的全局变量 //系统主界面 //主函数 int main() {

RecType S[100]; int i,k;

char ch1,ch2,q;

printf(\排序算法演示系统************\\n\\n\\t\\t请输入%d个待排序的数据:\\n\

for(i=1;i<=L;i++) { printf(\请输入第%dth数据:\ scanf(\ getchar(); }

ch1='y';

while(ch1=='y') { printf(\ 菜 单 \\n\

printf(\

printf(\更新排序数据* 2--------直接插入排序 \\n\ printf(\希 尔 排 序* 4--------冒 泡 排 序 \\n\ printf(\快 速 排 序* 6--------直接选择排序 \\n\ printf(\堆 排 序 * 8--------归 并 排 序 \\n\ printf(\退 出************ \\n\ printf(\

- 2 -

printf(\请选择:\scanf(\getchar();

for(i=1;i<=L;i++) { R[i].key=S[i].key; }

switch(ch2) {

case '1': printf(\请输入%d个待排序数据\\n\\t\\t\ for(i=1;i<=L;i++) { scanf(\ getchar(); printf(\ } printf(\数据输入完毕!\ break; case '2': Insertsort(); break; case '3': Shellsort(); break; case '4': Bubblesort(); break; case '5': printf(\原始数据为(按回车键开始排序):\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ } getchar(); printf(\ num=0;sun=0;sum=0; Quicksort(1,L); printf(\排序最终结果是:\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ } printf(\比较次数是:%d\\n\\t\\t\

- 3 -

}

printf(\交换次数是:%d\\n\\t\\t\ break; case '6': Selectsort(); break; case '7': Heap(); break; case '8': Mergesort(); break; case '0': ch1='n'; break; default: system(\清屏 printf(\对不起,您输入有误,请重新输入!\\n\ break; } if(ch2!='0') { if(ch2=='2'||ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch2=='8') { printf(\排序完毕!\ printf(\按回车键继续!\ q=getchar(); if(q!='\\n') { getchar(); ch1='n'; } } } }

return 1;

- 4 -

图一 主界面

4.1.1 冒泡排序 核心思想

依次比较相邻的两个数,将小数放在前面,大数放在后面,第一轮比较后,最大的数便被放到了最后;第二轮操作前n-1个数据(假设有n个数据),依然是依次比较相邻的两个数,将小数放在前面,大数放在后面,倒数第二个数便是第二大的数;同理第i轮操作前n-i+1的数据(假设i取值是从1开始的),则n-i+i位置上的数据为第i大的数据。一共有n-1轮,第i轮比较中共比较n-i次比较。 核心代码

void Bubblesort() {

int i,j,k,x=0,y=0,m=0;

int exchange=TRUE;//标志位exchange初始化为TRUE 1 printf(\原始数据为(按回车键开始排序):\\n\\t\\t\ for(k=1;k<=L;k++) {

- 5 -

}

printf(\}

getchar(); printf(\

for(i=1;i

printf(\比较次数是:\\t\\t\printf(\

printf(\移动次数是:\\t\\t\printf(\

printf(\排序最终结果是:\\n\\t\\t\for(i=1;i<=L;i++)

{ printf(\}

- 6 -

图二 直接插入排序

4.1.2 快速排序 核心思想

首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。 通常分割点的数据是随机选取的。这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。而只要两个子列表的大小差不多 核心代码 //递归算法实现

void Quicksort(int low,int high) {

int i=low,j=high,k; R[0].key=R[low].key; while(i

- 7 -

if(i

R[i].key=R[0].key; num++;

//输出语句包括排序的结果及次数

printf(\第%d趟快速排序的结果为:\\n\\t\\t\ for(k=1;k<=L;k++)

{ printf(\ }

getchar(); printf(\

if(low

图三 快速排序

- 8 -

4.1.3 直接插入排序

核心思想

经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止 核心代码

void Insertsort() {

int i,j,k,m=0,x=0; //初始化比较次数变量m,移动次数变量x printf(\原始数据为:(按回车键开始排序)\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ }

getchar(); printf(\ //主要运行部分 for(i=2;i<=L;i++) { if(R[i].key

- 9 -

}

printf(\第%d趟直接插入排序的结果为:\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ } getchar(); printf(\}

printf(\

printf(\比较次数是:\\t\\t\printf(\

printf(\移动次数是:\\t\\t\printf(\

printf(\排序最终结果是:\\n\\t\\t\for(i=1;i<=L;i++)

{ printf(\}

图四 直接插入排序

4.1.4 希尔排序 核心思想

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进

- 10 -

行直接插入排序;然后,取第二个增量d2

void Shellsort() {

int i,j,gap,x,k,y=0,m=0; //初始化比较次数变量m,移动次数变量y printf(\原始数据为:(按回车键开始排序)\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ }

getchar(); printf(\ //函数主要部分 gap=L/2; while(gap>0) { for(i=gap+1;i<=L;i++) { j=i-gap; while(j>0) { if(R[j].key>R[j+gap].key) { x=R[j].key;//交换语句 R[j].key=R[j+gap].key; R[j+gap].key=x; j=j-gap; y++;//移动次数++ } else { j=0; } } } gap=gap/2; m++;//比较次数++ //输出语句包括排序的结果及次数 printf(\第%d趟希尔排序的结果为:\\n\\t\\t\ for(k=1;k<=L;k++)

- 11 -

}

{ printf(\ } getchar(); printf(\}

printf(\比较次数是:\\t\\t\printf(\

printf(\移动次数是:\\t\\t\printf(\

printf(\排序最终结果是:\\n\\t\\t\for(i=1;i<=L;i++) { printf(\}

printf(\

图五 希尔排序

4.1.5 直接选择排序 核心思想

第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R{1}~R[n-1]中选取最小值,与R[2]交换,...., 第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取

- 12 -

最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列. 核心代码

void Selectsort() {

int i,j,k,h,x=0,y=0;

printf(\原始数据为(按回车键开始排序):\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ }

getchar(); printf(\ for(i=1;i

//输出语句包括排序的结果及次数 printf(\比较次数:%d\ printf(\移动次数:%d\

printf(\排序最终结果是:\\n\\t\\t\ for(i=1;i<=L;i++) printf(\ printf(\

- 13 -

}

图六 选择排序

4.1.6 堆排序 核心思想

堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。将原始记录序列建成一个堆,成为初始堆,并输出堆顶元素;调整剩余的记录序列,使之成为一个新堆,再输出堆顶元素;如此反复进行,当堆中只有一个元素时,整个序列的排序结束,输出的序列便是原始序列的非递减有序序列。在堆排序的过程中,主要负责两方面的工作:一是如何将原始记录序列构造成一个堆,即建立初始堆;二是输出堆顶元素后,如何将剩余记录整理成一个新堆。 核心代码

void CreateHeap(int root,int index,int *x,int *y) {

int j,temp,finish;

j=2*root; //j指向左孩子 temp=R[root].key; finish=0;

while(j<=index&&finish==0) { if(j

- 14 -

{ j++; } } //指向较大的孩子 if(temp>=R[j].key) { finish=1; } else { R[j/2].key=R[j].key; (*y)++; j=j*2; } *x = *x+2; }

R[j/2].key=temp; (*y)++; }

//堆排序

void Heapsort() {

int i,j,temp,k,x=0,y=0;

for(i=(L/2);i>=1;i--) //建立初始堆 { CreateHeap(i,L,&x,&y); } x=0; y=0;

for(i=L-1,k=1;i>=1;i--,k++) //将堆中根节点和最后一个节点交换 { temp=R[i+1].key; R[i+1].key=R[1].key; R[1].key=temp; CreateHeap(1,i,&x,&y); printf(\第%d趟堆排序的结果为:\\n\\t\\t\ for(j=1;j<=L;j++) { printf(\ } getchar(); printf(\ }

printf(\比较次数是:%d\\t\\t\

- 15 -

printf(\移动次数是:%d\\t\\t\}

void Heap() {

int i;

printf(\原始数据为(按回车键开始排序):\\n\\t\\t\ for(i=1;i<=L;i++) { printf(\ }

getchar(); printf(\ Heapsort();

printf(\排序最终结果是:\\n\\t\\t\ for(i=1;i<=L;i++) { printf(\ }

printf(\}

void Merge(int low,int mm,int high,int *x,int *y)//两个有序序列的合并 {

int i=low,j=mm+1,p=0;

RecType *R1; //i对第一个开始到结尾,j从第二个开始到结尾 R1=new RecType[high-low+1]; if(!R1) { printf(\内存不足!\ }

while(i<=mm&&j<=high)//两序列从起始位置开始将小的元素放入到R1中 { R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++]; (*x)++; (*y)++; }

while(i<=mm)//第二段结束,剩余放入R1中 { R1[p++]=R[i++]; (*y)++; }

while(j<=high)//第二段剩余,剩余放入R1中 { R1[p++]=R[j++];

- 16 -

}

(*y)++; }

for(p=0,i=low;i<=high;p++,i++)//剩余元素放入R1中,赋予R { R[i]=R1[p]; (*y)++; }

图七 堆排序

4.1.7 归并排序 核心思想

将有n个记录的原始序列看作n个有序子序列,每个子序列的长度为1,然后从第一个子序列开始,把相邻的子序列两两合并,得到[n/2]个长度为2或1的子序列(当子序列个数为奇数时,最后一组合并得到的序列长度为1),把这一过程称为一次归并排序,对第一次归并排序后的[n/2]个子序列采用上述方法继续顺序成对归并,如此重复,当最后得到的长度为n的一个子序列时,该子序列便是原始序列归并排序后的有序序列。 核心代码

void MergePass(int length,int *x,int *y)//一次二路归并排序 { int i;

- 17 -

for(i=1;i+2*length-1<=L;i=i+2*length)

{ Merge(i,i+length-1,i+2*length-1,x,y); //函数调用 }

if(i+length-1

{ Merge(i,i+length-1,L,x,y); //函数调用 } }

//归并排序

void Mergesort() //二路归并排序 { int length,k,m=0,i,x=0,y=0;

printf(\原始数据为(按回车键开始排序):\\n\\t\\t\for(k=1;k<=L;k++) { printf(\} getchar(); printf(\

for(length=1;length

m++; //输出语句包括排序的结果及次数

printf(\第%d趟归并排序的结果为:\\n\\t\\t\for(k=1;k<=L;k++) { printf(\} getchar(); printf(\}

printf(\排序最终结果是:\\n\\t\\t\for(i=1;i<=L;i++)

{ printf(\}

- 18 -

printf(\

printf(\比较次数:%d\\n\printf(\移动次数:%d\\n\}

图八 归并排序

五.总结或心得

回顾这个设计过程,我学到了许多书本上没有学到的知识。通过这次小组制作的程序,丰富了自己的实践技能,扩展了本专业的知识面,使我受益非浅,同时也体验到了搞软件开发的困难度。在这次设计的同时我又从中学到了许多东西。但由于我对这样的排序系统还只是一个开始,了解的不多,这其中或许还有很多的不足,在这里也恳请各位老师能够对我们的作品指明不足并加以改正。总之,在这一次的课程设计过程中,我们查阅了大量的资料,对数据结构有了一点初步的认识,对于网络工程这些辅助性的教材也巩固了不少,为我们这次的课设提供了很大的帮助,锻炼了我们的能力,让我更加熟练了这门程序设计语言:C/C++语言,系统地学习了数据结构方面的知识,并更进一步提高了我们在程序设计、调试方面的技巧。更重要的是,它还让我们认识到了自己的不足,在编程方面,我仅仅是刚刚入门而已,以后的道路任重道远,需要我不断的丰富自己、充实自

- 19 -

己,这样才能在程序设计方面有所收获。在最后也感谢我们的小组成员,我在他的帮忙下顺利的做好自己负责的部分.

六.参考文献

严蔚敏,吴伟明,《数据结构(C语言版)》,清华大学出版社,2007年:P263-P288。

七.附录

#include #include #include

#define L 8 //排序元素个数 #define FALSE 0 #define TRUE 1 typedef struct {

int key; }RecType; RecType R[L]; int num; int sum;

int sun; //定义排序趟数的全局变量 //系统主界面 void Bubblesort() {

int i,j,k,x=0,y=0,m=0;

int exchange=TRUE;//标志位exchange初始化为TRUE 1 printf(\原始数据为(按回车键开始排序):\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ }

getchar(); printf(\

for(i=1;i

- 20 -

R[0].key=R[j].key; R[j].key=R[j-1].key; R[j-1].key=R[0].key; exchange=TRUE; y++;//移动次数++ } } m--;//比较次数 if(exchange) //输出语句 { printf(\第%d趟冒泡排序的结果为:\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ } getchar(); printf(\ } }

printf(\比较次数是:\\t\\t\ printf(\

printf(\移动次数是:\\t\\t\ printf(\

printf(\排序最终结果是:\\n\\t\\t\ for(i=1;i<=L;i++)

{ printf(\ } }

//递归算法实现

void Quicksort(int low,int high) {

int i=low,j=high,k; R[0].key=R[low].key; while(i

- 21 -

while(i

R[i].key=R[0].key; num++;

//输出语句包括排序的结果及次数

printf(\第%d趟快速排序的结果为:\\n\\t\\t\ for(k=1;k<=L;k++)

{ printf(\ }

getchar(); printf(\

if(low

void Insertsort() {

int i,j,k,m=0,x=0; //初始化比较次数变量m,移动次数变量x printf(\原始数据为:(按回车键开始排序)\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ }

getchar(); printf(\ //主要运行部分 for(i=2;i<=L;i++) { if(R[i].key

- 22 -

j--; } R[j+1]=R[0]; x++; } m++; //输出语句包括排序的结果及次数 printf(\第%d趟直接插入排序的结果为:\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ } getchar(); printf(\ }

printf(\

printf(\比较次数是:\\t\\t\ printf(\

printf(\移动次数是:\\t\\t\ printf(\

printf(\排序最终结果是:\\n\\t\\t\ for(i=1;i<=L;i++)

{ printf(\ } }

void Shellsort() {

int i,j,gap,x,k,y=0,m=0; //初始化比较次数变量m,移动次数变量y printf(\原始数据为:(按回车键开始排序)\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ }

getchar(); printf(\ //函数主要部分 gap=L/2; while(gap>0) { for(i=gap+1;i<=L;i++) { j=i-gap; while(j>0) { if(R[j].key>R[j+gap].key)

- 23 -

{ x=R[j].key;//交换语句 R[j].key=R[j+gap].key; R[j+gap].key=x; j=j-gap; y++;//移动次数++ } else { j=0; } } } gap=gap/2; m++;//比较次数++ //输出语句包括排序的结果及次数 printf(\第%d趟希尔排序的结果为:\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ } getchar(); printf(\ }

printf(\比较次数是:\\t\\t\ printf(\

printf(\移动次数是:\\t\\t\ printf(\

printf(\排序最终结果是:\\n\\t\\t\ for(i=1;i<=L;i++) { printf(\ }

printf(\}

void Selectsort() {

int i,j,k,h,x=0,y=0;

printf(\原始数据为(按回车键开始排序):\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ }

getchar();

- 24 -

printf(\ for(i=1;i

//输出语句包括排序的结果及次数 printf(\比较次数:%d\ printf(\移动次数:%d\

printf(\排序最终结果是:\\n\\t\\t\ for(i=1;i<=L;i++) { printf(\ }

printf(\}

void CreateHeap(int root,int index,int *x,int *y) {

int j,temp,finish;

j=2*root; //j指向左孩子 temp=R[root].key; finish=0;

while(j<=index&&finish==0) {

- 25 -

if(j=R[j].key) { finish=1; } else { R[j/2].key=R[j].key; (*y)++; j=j*2; } *x = *x+2; }

R[j/2].key=temp; (*y)++; }

//堆排序

void Heapsort() {

int i,j,temp,k,x=0,y=0;

for(i=(L/2);i>=1;i--) //建立初始堆 { CreateHeap(i,L,&x,&y); } x=0; y=0;

for(i=L-1,k=1;i>=1;i--,k++) //将堆中根节点和最后一个节点交换 { temp=R[i+1].key; R[i+1].key=R[1].key; R[1].key=temp; CreateHeap(1,i,&x,&y); printf(\第%d趟堆排序的结果为:\\n\\t\\t\ for(j=1;j<=L;j++) { printf(\ } getchar();

- 26 -

printf(\ }

printf(\比较次数是:%d\\t\\t\ printf(\移动次数是:%d\\t\\t\}

void Heap() {

int i;

printf(\原始数据为(按回车键开始排序):\\n\\t\\t\ for(i=1;i<=L;i++) { printf(\ }

getchar(); printf(\ Heapsort();

printf(\排序最终结果是:\\n\\t\\t\ for(i=1;i<=L;i++) { printf(\ }

printf(\}

void Merge(int low,int mm,int high,int *x,int *y)//两个有序序列的合并 {

int i=low,j=mm+1,p=0;

RecType *R1; //i对第一个开始到结尾,j从第二个开始到结尾 R1=new RecType[high-low+1]; if(!R1) { printf(\内存不足!\ }

while(i<=mm&&j<=high)//两序列从起始位置开始将小的元素放入到R1中 { R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++]; (*x)++; (*y)++; }

while(i<=mm)//第二段结束,剩余放入R1中 { R1[p++]=R[i++]; (*y)++; }

while(j<=high)//第二段剩余,剩余放入R1中

- 27 -

{ R1[p++]=R[j++]; (*y)++; }

for(p=0,i=low;i<=high;p++,i++)//剩余元素放入R1中,赋予R { R[i]=R1[p]; (*y)++; } }

void MergePass(int length,int *x,int *y)//一次二路归并排序 { int i;

for(i=1;i+2*length-1<=L;i=i+2*length)

{ Merge(i,i+length-1,i+2*length-1,x,y); //函数调用 }

if(i+length-1

{ Merge(i,i+length-1,L,x,y); //函数调用 } }

//归并排序

void Mergesort() //二路归并排序 { int length,k,m=0,i,x=0,y=0;

printf(\原始数据为(按回车键开始排序):\\n\\t\\t\for(k=1;k<=L;k++)

{ printf(\}

getchar(); printf(\

for(length=1;length

m++; //输出语句包括排序的结果及次数

printf(\第%d趟归并排序的结果为:\\n\\t\\t\for(k=1;k<=L;k++)

{ printf(\}

getchar(); printf(\}

printf(\排序最终结果是:\\n\\t\\t\for(i=1;i<=L;i++)

{ printf(\}

printf(\

printf(\比较次数:%d\\n\

- 28 -

printf(\移动次数:%d\\n\}

//主函数 int main() {

RecType S[100]; int i,k;

char ch1,ch2,q;

printf(\排序算法演示系统************\\n\\n\\t\\t请输入%d个待排序的数据:\\n\ for(i=1;i<=L;i++) { printf(\请输入第%dth数据:\ scanf(\ getchar(); }

ch1='y';

while(ch1=='y') { printf(\ 菜 单 \\n\ printf(\ printf(\更新排序数据 * 2--------直接插入排序 \\n\ printf(\希 尔 排 序 * 4--------冒 泡 排 序 \\n\ printf(\快 速 排 序 * 6--------直接选择排序 \\n\ printf(\堆 排 序 * 8--------归 并 排 序 \\n\ printf(\退 出************ \\n\ printf(\ printf(\请选择:\ scanf(\ getchar(); for(i=1;i<=L;i++) { R[i].key=S[i].key; } switch(ch2) { case '1': printf(\请输入%d个待排序数据\\n\\t\\t\ for(i=1;i<=L;i++) { scanf(\ getchar(); printf(\

- 29 -

} printf(\数据输入完毕!\ break; case '2': Insertsort(); break; case '3': Shellsort(); break; case '4': Bubblesort(); break; case '5': printf(\原始数据为(按回车键开始排序):\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ } getchar(); printf(\ num=0;sun=0;sum=0; Quicksort(1,L); printf(\排序最终结果是:\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ } printf(\比较次数是:%d\\n\\t\\t\ printf(\交换次数是:%d\\n\\t\\t\ break; case '6': Selectsort(); break; case '7': Heap(); break; case '8': Mergesort(); break; case '0': ch1='n'; break; default: system(\清屏

- 30 -

printf(\对不起,您输入有误,请重新输入!\\n\ break; } if(ch2!='0') { if(ch2=='2'||ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch2=='8') { printf(\排序完毕!\ printf(\按回车键继续!\ } } }

return 1;

}

q=getchar(); if(q!='\\n') { getchar(); ch1='n'; } - 31 -