排序算法数据结构课程设计说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中北大学
数据结构
课程设计说明书
2012 年 1月 8 日
1设计目的
本系统是为了实现和比较各种不同排序方法的不同复杂度,而建立的,从不同的角度比较各算法的优劣,从而使使用者能对个排序方法有更清晰的了解.
2.设计内容和要求
本次设计的内容主要有实现各种排序算法以及比较各种算法。要求主要是要执行对一种数据类型的序列进行所有排序方法的排序计算,并返回序列及各算法的排序指标。
3.本设计所采用的数据结构
本次设计主要采用的数据结构有结构体定义,直接排序,选择排序,归并排序,快速排序,冒泡排序,希尔排序,堆排序等。
4.功能模块详细设计
4.1 详细设计思想
本次设计分主题设计和模块设计两部分。
主体设计方面,本系统的主要数据类型为含有一个关键字的结构体类型,命名为datatype;设置两个全局变量数组,cn和mn,分别用于记录每种排序方法中的各排序元素的比较次数和移动次数(关键字交换以3次计)的总和。
模块设计方面,本系统大致可分为排序模块部分和运行模块部分。排序模块部分分为归并排序模块,快速排序模块,冒泡排序模块,选择排序模块,直接排序模块,希尔排序模块,堆排序模块;运行模块部分分为主函数,自行输入模块,随机模块,输出模块。
以下是各排序算法的核心设计思想:
运行模块个算法如下:
4.2 核心代码
#include
#include
#include
#define MAXNUM 100
typedef struct
{ int key;
} datatype;
datatype R[MAXNUM];/*定义类型*/
int cn[MAXNUM],mn[MAXNUM];
void D_InsertSort(datatype R[ ], int n)/*直接排序*/ {
int i,j;
extern int cn[MAXNUM],mn[MAXNUM];
for(i=2; i<=n; i++)
{ cn[0]++;
if (R[i].key {R[0]=R[i]; mn[0]++; for(j=i-1; R[0].key R[j+1]=R[j]; R[j+1]=R[0]; mn[0]+=2; } } } void Select_Sort(datatype R[ ],int n)/*简单选择排序*/ { int i,j,k; extern int cn[MAXNUM],mn[MAXNUM]; for(i=1;i { k=i; for(j=i+1; j<=n; j++) { cn[1]++; if(R[j].key k=j; } if (i==k) { R[0]=R[k]; R[k]=R[i]; R[i]=R[0]; mn[1]+=3; } } } void Bubble_Sort (datatype R[ ], int n)/*冒泡排序*/ { int i, j; extern int cn[MAXNUM],mn[MAXNUM]; int swap; for(i=1; i {swap=0; for(j=1; j<=n-i; j++) { cn[2]++; if (R[j].key {R[0]=R[j]; R[j]=R[j+1]; R[j+1]=R[0]; mn[2]+=3; swap=1; }} if(swap==0) break; } } void HeapAdjust(datatype R[ ], int s, int t) { datatype rc; extern int cn[MAXNUM],mn[MAXNUM]; int i,j ; rc=R[s]; i=s; for(j=2*i; j<=t; j=2*j) { cn[3]++; if(j if(rc.key > R[j].key) break; R[i]=R[j]; mn[3]++; i=j; } R[i]=rc; } void HeapSort(datatype R[ ], int n)/*堆排序*/ { int i; extern int cn[MAXNUM],mn[MAXNUM]; 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); } } void Merge(datatype R[ ], datatype R1[ ], int s, int m , int t) { int i,j,k; extern int cn[MAXNUM],mn[MAXNUM]; i=s; j=m+1; k=s; while (i<=m&&j<=t) { cn[4]++; if(R[i].key { R1[k++]=R[i++]; mn[4]++;} else { R1[k++]=R[j++]; mn[4]++;} } while (i<=m) { R1[k++]=R[i++]; mn[4]++; } while (j<=t) { R1[k++]=R[j++]; mn[4]++;} }