数据结构 内部排序算法比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内部排序算法比较
1、课程设计的目的
本课程设计为了更好的了解和认识数据结构常用的内部排序算法。排序对于数据结构的管理来说是至关重要的,所以熟悉掌握和深入了解这些常用的经典内部排序算法是有必要的。
2、课程设计的要求
1. 掌握常用的排序方法和各种排序方法的特点。
2.熟悉排序的基本概念。
3、课程设计的内容
3.1需求分析
编制一个演示内部排序算法比较的程序。可对冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序和堆排序进行比较。
3.2概要设计
(1)冒泡排序
基本思想是:设数组a中存放了n 个数据元素,循环进行n-1次如下的排序过程:第一次时,依次比较相邻两个数据元素a[i]和a[i+1].key(i=0,1,2,3...,n-2).若为逆序,则交换两个数据元素,否则不交换,这样,当作完n-1次比较后数值最大的数据元素将比放置在a[n-1]中。第二次时,数据元素个数减1,即数据元素个数为n-1,操作方法与第一次类似,这样,n个数据元素集合中数值次大的数据元素将被放置在a[n-2]中。当第n-1次排序结束时,n个数据元素集合中次小的数据元素将被放置在a[1]中,而a[0]中放置了最小的数据元素。
冒泡排序算法的空间复杂度为o(n2)。
(2)直接插入排序
基本思想是:顺序地把待插入的数据元素按其关键字的大小插入到已排序数据元素子集合的适当位置.子集合的数据元素个数从只有一个数据元素开始逐次增大,当子集合最终与集合大小相同时排序完毕.
设待排序的N个数据元素存放在数组A中,初始时子集合a[0]以排好序.第一次循环准备把数据元素a[1]插入到以排好序的子集合中,这只需比较a[0].key和a[1].key,若
a[0].key<=a[1].key,则说明序列已有序,否则,将a[1]插入到a[0]之前,这样子集合的大小增大为2;第二次循环是把数据元素a[2]插入到以排好序的子集合中,这需要先比较
a[2].key和a[1].key,已确定是否需要把a[2]插到a[1]之前,然后比较a[2].key和
a[0].key,以确定是否需要把a[2]插入到a[0]之前;这样的循环过程一直进行到a[n-1]插入完为止.这时,数据元素集合a[0],a[1],a[2],...,a[n-1]就全部排好了序。
直接插入排序算法最坏情况下的时间复杂度为O(n2).
(3)直接选择排序
基本思想是:从待排序的数据元素集合中选取关键字最小的数据元素并将它与原始数据元素集合中的第一个数据元素交换位置;然后从不包括第一个位置的数据元素集合中选取关键字最小的数据元素并将它与原始数据集合中的第二个数据元素交换位置;如此重复,直到数据元素集合中只剩一个数据元素为止。
直接选择排序算法的时间复杂度为O(n2)。
(4)快速排序
快速排序是一种二叉树结构的交换排序方法,其基本思想是:设数组a中存放了n个数据元素,low为数组的低端下标,high为数组的高端下标,从数组a中任取一个元素作为标准,调整数组a中各个元素的位置,使排在标准元素前面元素的关键字均小于标准元素的关键字,排在标准元素后面元素均大于或等于标准元素的关键字。这样一次过程结束后,一方面将标准元素放在了未来排好序的数组中该标准元素应在的位置上,另一方面将数组中的元素以标准元素为中心分为了两个子数组,位于标准元素左边均大于等于标准元素的关键字。然后对这两个子数组中的元素分别再进行方法类同的递归快速排序。
(5)堆排序
堆排序的基本思想是:循环执行如下过程直到数组为空:(1)把堆顶a[0]元素为最大元素与当前最大堆的最后一个元素交换;(2)最大堆元素个数减1;(3)若此时根节点不满足最大堆的定义,则调整根节点使之满足最大堆的定义。
堆排序算法的时间复杂度为O(nlog2n)。
(6)各种排序的比较
通过计算各种排序算法的平均时间复杂度等来比较几种算法。
冒泡排序算法平均时间复杂度为o(n2)。冒泡排序算法的空间复杂度为o(1).显然,冒泡排序是一种稳定的排序方法。
直接插入排序算法的时间复杂度为o(n2),空间复杂度为O(1).显然,直接插入排序算法
是一种稳定的排序算法.
直接选择排序算法的时间复杂度为O(n2)。直接选接排序算法的空间复杂度为o(2)。显然,直接选择排序算法是一种不稳定的排序算法.
快速排序算法的平均算法复杂度为O(log2n)。平均空间复杂度为O(log2n)。快速排序算法是一种不稳定的排序方法。
堆排序算法的时间复杂度为O(nlog2n)。堆排序算法的空间复杂度为O(1)。观察例子即可发现,堆排序算法是一种不稳定的排序方法。
3.3详细设计(源代码)
#include
#include
#include
#include
typedef int DataType;
#define MaxSize 100
static int SortTAndTs[6][4];
void SortTimeAndTimes(int No,int time,int times)//算法的数据交换次数和算法耗时
{
SortTAndTs[No][1]=No;
SortTAndTs[No][2]=time;
SortTAndTs[No][3]=times;
}
void ShowResult()
{
printf("排序方法\t数据交换次数\t排序所耗时间\n");
for(int i=1;i<=6;i++)
{
if(SortTAndTs[i][1]==1)
{
printf("冒泡排序法\t");
printf("%d\t\t",SortTAndTs[i][2]);
printf("%d\n",SortTAndTs[i][3]);
}
else if(SortTAndTs[i][1]==2)
{
printf("直接插入排序\t");
printf("%d\t\t",SortTAndTs[i][2]);
printf("%d\n",SortTAndTs[i][3]);
}
else if(SortTAndTs[i][1]==3)