- 1、本文档共36页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构课程设计报告(各种排序实现及对比).doc
课 程 设 计 报 告
课程名称 数据结构
课题名称 1.成绩排序 2.通讯录管理2014年月日
设计题目
成绩各种排序
算法设计的思想
3.1简单选择排序?????1?基本思想 每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列的第i个关键字。
3.5快速排序
??1?基本思想
??????快速排序的基本思想是基于分治策略的。对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分三步处理
:
?????分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值
。
?????递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。
?? 合并(Merge):由于对分解出的两个子序列的排序是就地进行的,所以在L[p..q]和L[q+1..r]都排好序后不需要执行任何计算L[p..r]就已排好序。
???
算法的流程图
4.1主函数的算法流程图
4.6快速排序的算法流程图(1)
4.7快速排序的算法流程图(2)
算法设计分析
5.5快速排序
快速排序是通过比较关键码、交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分。其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码。我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分。对各部分不断划分,直到整个序列按关键码有序。
【效率分析】
空间效率:快速排序是递归的,每层递归调用时的指针和参数均要用栈来存放,递归调用层次数与上述二叉树的深度一致。因而,存储开销在理想情况下为O(log2n),即树的高度;在最坏情况下,即二叉树是一个单链,为O(n)。
时间效率:在n个记录的待排序列中,一次划分需要约n次关键码比较,时效为O(n),若设T(n)为对n个记录的待排序列进行快速排序所需时间。
理想情况下:每次划分,正好将分成两个等长的子序列,则
T(n)≤cn+2T(n/2) c是一个常数
≤cn+2(cn/2+2T(n/4))=2cn+4T(n/4)
≤2cn+4(cn/4+T(n/8))=3cn+8T(n/8)
······
≤cnlog2n+nT(1)=O(nlog2n)
最坏情况下:即每次划分,只得到一个子序列,时效为O(n2)。
快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取支点记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。
排序方法 最好时间 平均时间 最坏时间 稳定性 插入排序 直接插入排序 O(n) O(n2) O(n2) 稳定 希尔排序 O(n1.5) 不稳定 交换排序 冒泡排序 O(n) O(n2) O(n2) 稳定 快速排序 O(nlogn) O(nlogn) O(n2) 不稳定 选择排序 直接选择排序 O(n2) O(n2) O(n2) 不稳定 内部排序各种算法的性能比较(表)
源代码
#include stdlib.h
#includestdio.h
#includetime.h
#define MAXSIZE 200
typedef int KeyType;
typedef struct //定义存储记录关键字及其他信息的结构体
{ KeyType key;
char other;
}RedType;
typedef struct //定义存储所有记录的结构体
{ RedType r[MAXSIZE+1];
int length;
}SqList;
typedef struct{
int move; /*记录数据移动次数*/
int comp; /*记录数据比较次数*/
}Recode;
int dlta[5]={31,15,7,3,1}; //初始化希尔排序的增量序列
int num[10]={0}; //记录每个排序方法的移动次数和比较次数
int flag=0; //标记变量
//利用产生的随即数模拟用户输入的数据
void create(SqList *L,int length)
{ int i;
sra
文档评论(0)