大数据结构课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书
课程名称:数据结构和算法
设计题目:多种排序
院系:计算机科学与信息工程学院
学生:
学号:
专业班级:计科嵌入式(12-1)
指导教师:
年月日
课程设计任务书
多种排序
摘要:
排序是算法中最基础的问题之一,经典的排序算法是前人不断总结得到的,基于比较的方法是比较直观的方式,主要存在插入法排序、堆排序、希尔排序、归并排序、快速排序,每一种排序算法都有自己的优缺点,比如插入法排序适用于那些长度短的排序,要是长的话,有些爱莫能助啦,堆排序主要是依据了二叉堆的特性,但是创建堆的过程也是一个复杂的问题,希尔排序的过程是一个不断精确的过程,但是目前也只是一个经验方式。归并排序是一个递归的问题,采用分治的思想实现,但是这种算法需要额外的存储空间,快速排序虽然是实践中比较常用的算法,但是对于有序的数组采用快速排序就是灾难。比较型算法的时间复杂度最优也只能到达O(NlogN)。
关键词:
归并排序快排排序选择排序冒泡排序
插入排序堆排序希尔排序部排序
目录
1. 设计背景 (4)
1.1问题描述 (4)
1.2 问题分析 (4)
2.设计方案 (4)
2.1 算法设计 (4)
2.2 功能模块分析 (6)
3.主要算法流程图 (15)
4. 结果与结论 (16)
4.1正确结果 (16)
4.2错误信息 (18)
5. 算法复杂度以及稳定性分析 (18)
6. 收获与致 (18)
7. 参考文献 (19)
8. 附件 (20)
1. 设计背景
1.1问题描述
利用随机函数产生N个随机整数(10000以上),对这些数进行多种方法进行排序。包括:插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序。
1.2 问题分析
经典的排序算法是前人不断总结得到的,基于比较的方法是比较直观的方式,主要存在插入法排序、堆排序、希尔排序、归并排序、快速排序,每一种排序算法都有自己的优缺点。
2.设计方案
2.1 算法设计
(1)选择排序
在待排序的一组数据元素中,选出最小的一个数据元素与第一个位置的数据元素交换;然后在剩下的数据元素当中再找最小的与第二个位置的数据元素交换,循环到只剩下最后一个数据元素为止。
(2)冒泡排序
相邻的两个元素进行比较,将小的调到前面,大的调到后面。
(3)插入排序
待排序的记录放在数组R[0…n-1]中排序过程中某一时刻,R被划分成两个子区间R[0,i-1] (有序和)R[i…n-1](无序)。直接插入的基本操作是将当前无序区的一个记录R[i]插入到有序区R[0…i-1]中适当的位置
(4)快速排序
在待排序的数组的n个元素中取一个元素(一般取第一个),将其移动到这样的位置:在其之前的元素的值都小于它,在其之后的元素都大于它,这样是一趟快速排序;然后对数组的两个部分进行同样的操作,直到每部分只有一个记录为止;总之,每趟使表的第一个元素放在适当位置,将表两分,再对两子表进行同样的递归划分,直至划分的子表长度为1。
(5)堆排序
堆排序中 heap 算法的时间复杂度与堆所对应的完全二叉树的树高度 log2n 相关。而heapsort 中对heap 的调用数量级为n,所以堆排序的整个时间复杂度为O(nlog2n) 。并且堆排序是不稳定的。堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。
(6)归并排序
将两个或两个以上的有序表组成一个新的有序表。
(7)希尔排序
将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。增量的选择:在每趟的排序过程都有一个增量,至少满足一个规则增量关系 d[1] > d[2] > d[3] >..> d[t] = 1 (t趟排序);根据增量序列的选取其时间复杂度也会有变化,这个不少论文进行了研究,在此处就不再深究;本文采用首选增量为n/2,以此递推,每次增量为原先的1/2,直到增量为1。
2.2 功能模块分析
1.数据输入:采取随机函数实现输入数据表。
int input_num()
{
printf("您要给多少个数排序?\n\t\t");
scanf("%d",&data_num);
srand(NULL);
printf("随机产生%d个数:\n\t\t",data_num);
for(int i=1;i<=data_num;i++)
{
data_array[i]=rand()%10000000;
printf("%d\n",data_array[i]);
old[i]=data_array[i];
printf("\n\t\t");
}
}
2.数据输出:for循环输出即可。
int outnew0()
{
printf("排序后的结果为:");
for(int i=data_num;i>=1;i--)
printf("%d%s",data_array[i],i!=1?" ":"\n");
}
其中增加了输出空格与换行区别。