1 问题描述
设计一个测试程序比较起泡排序、直接排序、简单选择排序、快速排序、希尔排序、堆排序算法的关键字比较次数
2 需求分析
2.1原理
2.2要求
3 概要设计
3.1抽象数据类型定义
3.2子程序及功能要求
3.3各程序模块之间的调用关系
主函数调用子程序1。
子程序1调用子程序2,3,4,5,6,7。
主函数调用子程序2,2,4,5,6,7。
4详细设计
4.1设计相应数据结构
4.2主要模块的算法描述
4.2.1冒泡排序子程序流程图
4.2.2插入排序子程序流程图
4.2.3希尔排序子程序流程图
4.2.4归并排序子程序流程图
4.2.5快速排序子程序流程图
4.2.6堆排序子程序流程图
4.2.7系统流程图
5 测试分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
输入100个数据分五组比较,待排序表长为100,关键字比较结果如下:
冒泡排序比较次数4950,移动次数6553701。
插入排序比较次数12845154,移动次数6553701。
希尔排序比较次数49,移动次数6553701。
选择排序比较次数4950,移动次数6553701。
快速排序比较次数1049,移动次数1114。
堆排序比较次数71566300,移动次数112458500。
6 课程设计的总结与体会
参考文献
附录(源程序清单)
#include /*进行头文件的声明并对数据进行初始化*/
#include
#define N 100
typedef int KeyType;/*运用结构体定义指针变量*/
typedef struct rec
{
KeyType key;
}rec;
typedef struct rec sqlist[N];
int p,q;
/*冒泡排序*/
void mergelist(sqlist a,int n)/*随机输入数据*/
{int i;
for(i=0;i
{
a[i].key=random(1000);
}
}
void gensort(int b[],int n)
{
int i,j;int s=0,t=0;/*定义数据类型并初始化*/
for(i=0;i
{
for(j=i+1;j
{
t++;
if(b[i]>b[j])
{
int temp=b[i];
b[i]=b[j];
b[j]=temp;
s+=3;
}}}
printf("\ngensort t=%ld,s=%ld\n",t,s);/*输出结果*/
}
}
/*插入排序*/
typedef int KeyType;/*定义指针类型与结构类型*/
struct rec
{
KeyType key;
};
typedef rec sqlist[N];
void insertsort(sqlist b,int n)
{
int i,j;int s=0,t=0;/*定义数据类型并初始化*/
for(i=2;i
{
b[0]=b[i];/*b[0]是循环结束标志*/
s++;
j=i-1;
t++;
while(b[0].key
{
b[j+1]=b[j];
j--;
s++;
t++;
}
b[j+1]=b[0];/*在j+1位置上插入r[i]*/
s++;
}
printf("\nInsertSort t=%ld,s=%ld\n",t,s);/*输出结果
}
/*希尔排序*/
void shellsort(sqlist b,int n)
{
int i,j,gap;/*定义数据类型*/
rec x;
int s=0,t=0;
gap=n/2;/*设置增量初值*/
while(gap>0)
{
for(i=gap+1;i
{
j=i-gap;
while(j>0)
{
t++;
if(b[j].key>b[j+gap].key)
{
x=b[j];b[j]=b[j+gap];/*将b[j]与b[j+gap]进行交换*/
b[j+gap]=x;j=j-gap;
s+=3;
}
else j=0;
gap=gap/2;/*减小增量*/
}}
printf("\nshellsort t=%ld,s=%ld\n",t,s);
}}
/*选择排序*/
void selectsort(int b[],int n)
{
int i,j,k;/*定义数据类型并初始化*/
int s=0,t=0;
for(i=0;i
{k=i;
for(j=i+1;j
{
t++;
if(b[k]>b[j]) /*用k指出每趟在无序区段的最小元素*/
{k=j;}
}
if(k!=i)
{int temp=b[k];
b[k]=b[i];/*找到最小值后进行交换*/
b[i]=temp;
s+=3;
}}
printf("\nSelectSort t=%ld,s=%ld\n",t,s);/*输出结果*/
}
/*快速排序*/
void output(sqlist b,int n)/*输出元素值*/
{
for(int i=0;i
printf(“%4d”,b[i].key”);
printf(“endl”);
}
void display(int n,int m)/*输出计数*/
{
printf("\n t=%ld,s=%ld\n",s,t);
}
void BeforeSort()/*初始化计数器*/
{
p=0;q=0;
}
void quicksort(sqlist r,int s,int t)
{
int i=s,j=t;/*定义数据类型并初始化*/
if(s
{
r[0]=r[s];p++;
while(i
{
p++;
while(i=r[0].key)/*比较*/
j--;
r[i]=r[j];
q++;
p++;
p++;
while(i
i++;
r[j]=r[i];q++;p++;
}
r[i]=r[0];p++;
}
else return;
quicksort(r,s,j-1);
quicksort(r,j+1,t);
printf(“quicksort p=%d,q=%d”,p,q);
}
void sort(sqlist r,int s,int t)
{
BeforeSort();
quicksort(r,s,t);
display(p,q);
}
/*堆排序*/
void sift(sqlist r,int s,int m)
{
int j;
rec x;
x=r[s];
for(j=2*i;j<=m;j*=2)/*r(j)是r(s)的左结点*/
{q++;
if(j
++j;
q++;
if(!(x.key
r[s]=r[j];s=j;p++;}/*将r[j]调到父结点的位置上,并修改s与j的值,以便继续向
r[s]=x;p++;/*被筛结点的值放入最终位置*/
}
void heapsort(sqlist &r,int m)
{
int i;rec w;
for(i=m/2;i>0;--i) /*建立初始堆*/
sift(r,i,m);
for(i=m;i>1;--i)/*进行n-1次循环,完成堆排序*/
{
w=r[i];r[i]=r[1];/*将第一个元素同当前区间内最后一个元素对换*/
r[1]=w;
p+=3;
sift(r,1,i-1);/*筛r[1]结点,得到(i-1)个结点的堆*/
}
}
void sorting(sqlist &r,int t)
{
BeforeSort();
heapsort(r,t);
display(p,q);}
void main()
{
int a1[N],i;
int e=N;
for(i=0;i
{a1[i]=e--;}
printf("排序前数组:\n")
for(i=0;i
printf(“%4d”,a1[i]”);
printf("endl")
sqlist a,b;
printf("起泡排序运行结果:\n");
gensort(a1,sizeof(a1)/sizeof(int));
printf("插入排序运行结果:\n");
e=N;
for(i=0;i
{
a[i].key=e--;
}
insertsort(a,N);
e=N;
for(i=0;i
{
b[i].key=e--;}
printf("希尔排序运行结果:\n");
shellsort(b,N);
printf("选择排序运行结果:\n");
e=N;
int c1[N];
for(i=0;i
c1[i]=e--;
selectsort(c1,N);
printf("快速排序运行结果:\n");
e=N;
sqlist c;
int low=0,high=10;
for(i=0;i
{
c[i].key=e--;
}
sort(c,low,high);
printf("堆排序运行结果:\n");
sqlist d;
e=N;
for(i=0;i
d[i].key=e--;
sorting(d,N);
printf("排序后数组:\n");
for(i=0;i
printf("%4d”,a1[i]);
printf("endl");
e=1;
for(i=0;i
{a1[i]=e++;}
printf("排序前数组:\n");
for(i=0;i
printf("%4d”,a1[i]);
printf("endl");
printf("起泡排序运行结果:\n");
gensort(a1,sizeof(a1)/sizeof(int));
prinft("插入排序运行结果:\n");
e=1;
for(i=0;i
{a[i].key=e++;}
insertsort(a,N);
e=1;
for(i=0;i
{
b[i].key=e++;
}
printf("希尔排序运行结果:\n");
shellsort(b,N);
printf("选择排序运行结果:\n");
e=1;
for(i=0;i
c1[i]=e++;
selectsort(c1,N);
printf("快速排序运行结果:\n");
e=1;
for(i=0;i
{c[i].key=e++;}
sort(c,low,high);
printf("堆排序运行结果:\n");
e=1;
for(i=0;i
d[i].key=e++;
sorting(d,N);
printf("排序后数组:\n");
for(i=0;i
printf("%4d”,a1[i]);
printf("endl");
printf("排序前数组:\n");
for(i=0;i
printf("%4d”,a1[i]);
printf("endl");
printf("起泡排序运行结果:\n");
gensort(a1,sizeof(a1)/sizeof(int));
printf("插入排序运行结果:\n");
insertsort(a,N);
printf("希尔排序运行结果:\n");
shellsort(b,N);
printf("选择排序运行结果:\n");
selectsort(c1,N);
printf("快速排序运行结果:\n");
quicksort(c,low,high);
printf("堆排序运行结果:\n");
sorting(d,N);
printf("排序后数组:\n");
for(i=0;i
printf("setw(4),a1[i]");
printf("endl");
getch();
}