当前位置:文档之家› 数据结构课程设计(内部排序算法比较_C语言)

数据结构课程设计(内部排序算法比较_C语言)

(2) 排序功能:系统有 简单选择排序,冒泡排序,堆排序,二路归并排序,快速 排序的功能。
(3)打印清晰:系统会打印出在排序操作之前电脑随机取数或者用户输入的原始 排列顺序;并将排序操作之后的有序数据打印在原始数据的下面以便用户的 对比。在排序操作结束之后系统将以直方图的形式打出排序过程中比较和移 动次数让客户一目了然地看到排序的结果:
for(i=2; i<=n; i++) { cn[0]++; if (R[i].key<R[i-1].key)
{R[0]=R[i]; mn[0]++; for(j=i-1; R[0].key<R[j].key; j--)
R[j+1]=R[j]; R[j+1]=R[0]; mn[0]+=2; }
}
}
(三)简单选择排序: void Select_Sort(datatype R[ ],int n)//简单选择排序 { int i,j,k;
|******************************|
(3.1) (II)方便快捷的操作:用户只需要根据不同的需要在界面上输入系统提醒的操作形式直
接进行相应的操作方式即可!如图(3.2 所示)
|******************************| |-------欢 迎 使 用---------| |-----(1)随 机 取 数-------| |-----(2)自 行 输 入-------| |-----(0)退 出 使 用-------|
} (十)主函数调用:
int main(void)
{
******************************|\n");
printf("
|-------欢 迎 使 用-----------------|\n");
printf("
|-----(1)随 机 取 数-------------|\n");
2
第三章 系统设计
(I) 友好的人机界面设计:(如图 3.1 所示)
|******************************| |-------欢 迎 使 用---------| |-----(1)随 机 取 数-------| |-----(2)自 行 输 入-------| |-----(0)退 出 使 用-------|
else {m=(s+t)/2; MSort(R, R1, s, m); MSort(R, R1, m+1, t); Merge(R1, R, s, m, t); }
}
void MergeSort(datatype R[ ], datatype R1[ ], int n)//归并排序 { MSort(R, R1,1, n); } int Partition(datatype R[ ], int low, int high)
数据结构课程设计
课程名称: 内部排序算法比较 年级/院系:11 级计算机科学与技术学院 姓名/学号: 指导老师:
1
第一章 问题描述
排序是数据结构中重要的一个部分,也是在实际开发中易遇到的问题,所以研究各种排 算法的时间消耗对于在实际应用当中很有必要通过分析实际结合算法的特性进行选择和使 用哪种算法可以使实际问题得到更好更充分的解决!该系统通过对各种内部排序算法如直接 插入排序,冒泡排序,简单选择排序,快速排序,希尔排序,堆排序、二路归并排序等,以 关键码的比较次数和移动次数分析其特点,并进行比较,估算每种算法的时间消耗,从而比 较各种算法的优劣和使用情况!排序表的数据是多种不同的情况,如随机产生数据、极端的 数据如已是正序或逆序数据。比较的结果用一个直方图表示。
}
} (六)归并排序:
void Merge(datatype R[ ], datatype R1[ ], int s, int m , int t) {
int i,j,k; i=s; j=m+1; k=s;
while (i<=m&&j<=t) { cn[4]++; if(R[i].key<R[j].key) { R1[k++]=R[i++]; mn[4]++;} else { R1[k++]=R[j++]; mn[4]++;} }
4
for(i=1;i<n;i++) { k=i;
for(j=i+1; j<=n; j++) { cn[1]++; if(R[j].key<R[k].key) k=j; } if (i=k) { R[0]=R[k]; R[k]=R[i]; R[i]=R[0]; mn[1]+=3; } }
} (四)冒泡排序:
} R[i]=rc; } void HeapSort(datatype R[ ], int n)//堆排序 { int i; for(i=n/2; i>0; i-- ) HeapAdjust(R, i, n); for(i=n; i>1; i--)
{ R[0]=R[1]; R[1]=R[i]; R[i]=R[0]; mn[3]+=3; HeapAdjust(R,1, i-1);
3
排序方式 直接
简单选择 冒泡 堆排序
直接 快速
比较结果 比较次数
移动次数
第四章 系统实现
(一)定义结构体数组: typedef struct { int key; } datatype; datatype R[MAXNUM];//定义结构体数组 (二)直接排序: void D_InsertSort(datatype R[ ], int n)//直接排序 { int i,j;
printf("
|-----(2)自 行 输 入-------------|\n");
void Bubble_Sort (datatype R[ ], int n)//冒泡排序 { int i, j; int swap;
for(i=1; i<n-1; i++) {swap=0;
for(j=1; j<=n-i; j++) { cn[2]++; if (R[j].key<R[j+1].key) {R[0]=R[j]; R[j]=R[j+1]; R[j+1]=R[0]; mn[2]+=3; swap=1; }}
} (九)用户自行输入:
void zixing_input() { int n,i; datatype R1[MAXNUM]={0}; printf("请输入你要输入的个数(不大于于 30 的整数):"); scanf("%d",&n); printf("请输入各个元素:"); for(i=1;i<n+1;i++) scanf("%d",&R1[i].key); printf("排序前元素顺序为:"); for(i=1;i<n+1;i++) printf("%d ",R1[i].key); printf("\n"); D_InsertSort(R1,n);//直接排序 prin(R1,n);
} R[low]=R[0]; mn[5]++; return low; } (七)快速排序: void Quick_Sort(datatype R[ ], int s, int t)//快速排序 {
int i; if( s<t )
{ i = Partition(R, s, t); Quick_Sort(R, s, i-1); Quick_Sort(R, i+1, t);
{ R[0]=R[low]; mn[5]++; while(low<high) { while(low<high&&R[high].key>=R[0].key) {cn[5]++; high--;} if(low<high) { R[low]=R[high]; low++; mn[5]++; }
while(low<high&&R[low].key<R[0].key) { mn[5]++; low++; } if(low<high) {R[high]=R[low]; high--; mn[5]++; }
if(swap==0) break;
} }
(五)堆排序: void HeapAdjust(datatype R[ ], int s, int t) {
datatype rc;
5
int i,j ; rc=R[s]; i=s; for(j=2*i; j<=t; j=2*j)
{ cn[3]++; if(j<t && R[j].key<R[j+1].key)j=j+1; if(rc.key > R[j].key) break; R[i]=R[j]; mn[3]++; i=j;
请 选 择 操 作 方 式: 如上图所示该系统的功能有:
(1):选择 1 时系统由客户输入要进行测试的元素个数由电脑随 机选取数字进行各种排序结果得到准确的比较和移动次数并 打印出结果。
(2)选择 2 时系统由客户自己输入要进行测试的元素进行各种 排序结果得到准确的比较和移动次数并打印出结果。
相关主题