合肥学院
计算机科学与技术系
课程设计报告
2014 ~2015 学年第 学期
课程 数据结构与算法课程设计名称内部排序算法比较学生姓名学号专业班级指导教师 2015 年 1 月
【课题22、】内部排序算法比较
一、问题分析和任务定义
根据对本设计任务要求的理解和分析按以下点问题进行分析
二、数据结构的选择和
为了实现十种排序算法,产生的随机数用顺序表存储比较方便。顺序表数据类型(存储结构)描述如下:
typedef int KeyType;
struct rec KeyType key;
;
typedef rec sqlist[N];
2.主程序与各模块之间的关系是:
1 void gensort int b[],int n 起泡排序
2 void insertsort sqlist b,int n 插入排序
3 void so sqlist num,int n 折半插入排序
4 void shellsort sqlist b,int n 希尔排序
5 void gentsort int b[],int n 选择排序
6 void output sqlist b,int n 快速排序
7 void sort3 sqlist nu,int n //2-路插入排序
8 void Merge sqlist a, sqlist b, int low, int mid, int high 二路归并排序
9 void MergePass sqlist a, sqlist b, int n, int lenth 一趟归并排序
10 void MergeSort sqlist a, int n //进行二路归并
11 void sift sqlist r,int s,int m 堆排序
12 void init int a[] //随机生成N个整数
三、详细设计和编码
在整个课程设计中要求实现要求的功能必须要有主函数并通过主函数调用各功能子模块以上展示各个模块的功能以下将分析主函数和各个模块中的具体算法和实现
1.起泡排序函数的实现
函数声明:void gensort int b[],int n
起泡排序的基本思想是将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。依次类推,直至第n-1个记录和第n个记录的关键字进行比较为止。起泡排序是一种稳定的排序方法,在随机产生数的情况下,总的时间复杂度为O n2 。
2. 选择排序函数的实现
函数声明:void gentsort int b[],int n
选择排序法的基本思想是:第i趟排序通过n-i次关键码的比较,在n-1+i
1 i n-1 个记录中选取关键码最小的记录,并和第i个记录交换作为有序序列的第i个记录。选择排序是一种稳定的排序方法,总的时间复杂度是O n2 。
3. 插入排序函数的实现
函数声明:void insertsort sqlist b,int n
直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到排好序的有序表中,直到无序区中没有记录为止,从而得到一个新的有序表。直接插入排序是一种稳定的排序方法,其时间复杂度为O n 。
4. 希尔排序函数的实现
函数声明:void shellsort sqlist b,int n
希尔排序又称增量缩小排序先将序列按增量划分为元素个数相同的若干,直接插入排序,然后不断缩小增量直至为1,最后使用直接插入排序完成排序void sift sqlist r,int s,int m
首先将待排序的记录序列构造成一个堆,此时,选出了堆中所有记录的最大者即堆顶记录,然后将它们从堆中移走(通常将堆顶记录和堆中最后一个记录交换),并将剩余的记录再调整成堆,这样又找出了次大的记录,依此类推,直到堆中只有一个记录为止。堆排序是一种不稳定的排序方法,总的时间复杂度为O nlog2n 。
8.二路归并排序函数的实现
函数声明:void Merge sqlist a, sqlist b, int low, int mid, int high
void MergePass sqlist a, sqlist b, int n, int lenth
void MergeSort sqlist a, int n
合并排序:这里的合并排序和下边要描述的快速排序都采用了分而治之的思想,但两者仍然有很大差异。合并排序是将一个无序数组n[1…r]分成两个数组n[1…r/2]与n[r/2+1…r],分别对这两个小数组进行合并排序,然后再将这两个数组合并成一个大数组。由此我们看出合