- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构之排序课件PPT
数据结构;第九章 排序;要 求
熟练掌握以下内容:
熟悉各种内部排序方法的基本思想和特点
各种排序方法的优缺点、时、空性能和适用场合
熟悉并掌握三种简单排序算法、快速排序算法和堆排序算法
了解以下内容:
二路归并排序算法
基数排序算法;排序的历史;公元134-135年,某些希腊文稿包含一些分类账的片断,他列出了按头两个字母排序的纳税人的名字.
……
对于今天排序技术起源的探索,是19世纪末发明的排序机器.1880年,美国人口普查,数据处理成为令人头痛的问题—无法在当年完成. 赫尔曼.霍勒里斯(Herman Hollerith),一位人口统计局的20岁的职员,发明了一台巧妙的制表机,用100台这样的制表机,成功的完成了人口普查的统计问题.
……;记录的形式定义为:
Typedef struct rectype
{
KeyType key; /*关键字*/
itemType otherinfo; /*其他域*/
}rectype; ;大多数的排序方法数据是存储在内存中,并在内存中加以处理的,这种排序方法叫内部排序。
如果在排序过程中,数据的主要部分存放在外存储器中(如软盘、硬盘、磁带),借助内存进行内、外存数据交换,逐步排列记录之间的顺序,则称之为外部排序。
一种排序方法,如果排序后具有相同关键字的记录仍维持排序之前的相对次序,则称之为稳定的,否则称为不稳定的。;9.2 三种简单排序算法;1 直接插入排序;图9.1 直接插入排序;直接插入排序算法; 性能分析;性能分析;2. 冒泡排序;图9.2 冒泡排序过程; 冒泡排序算法
void bubblesort(r[ ], n)
{ int i, j;
for (i=1; in; i++)
{ for ( j=1; j=n-i; j++)
if (r[j+1].key r[j].key)
r[j] ? r[j+1];
}
}
; 修正后的冒泡排序算法
void bubblesort(r[ ], n)
{ int i, j, flag;
for(i=1; in; i++)
{ flag=1;
for( j=1; j=n-i; j++)
if (r[j+1].key r[j].key)
{ flag=0;
r[j] ? r[j+1];
}
if (flag==1) return;
}
};Flag的作用
用来指示扫描中有没有进行数据交换,每趟扫描开始前将其置1。当这趟扫描至少出现一次互换时,将其置0。如某趟扫描后flag仍???1,说明此趟扫描已无数据互换,则排序结束,不必再继续扫描了。;冒泡排序算法分析;3.简单选择排序;图9.3 简单选择排序;简单选择排序算法;简单选择排序分析;直接插入排序和简单选择排序的比较;9.3 希尔排序;希尔排序算法;Void shellpass (r[], n, d) /*一趟希尔排序*/
{ int i, k;
for (i=d+1, i=n; i++)
{ r[0]=r [i];
k=i-d;
while((k0) (r[0].keyr[k].key))
{ r[k+d}.key=r[k].key;
k=k-d;
}
r[k+d]=r[0];
}
};文件的分割不是简单地“逐段分割”,而是将相隔某个“增量”的记录组成一个子文件,这样可以使元素跳跃式地移动;每个子文件中的元素个数不必相等。
任何增量序列能使用,但必须保证t1=1;当增量序列为1时,该算法就退化成直接插入排序了。
希尔排序是不稳定的。;9.4 快速排序;第一次划分以后,再用相同的算法对划成的两部分分别进行类似的运算,即从每一部分中任选一个数据将其划分成更小的两部分。依此递归地做下去,直至每个小部分中的数据个数为1时,排序过程就结束了。
图7.7所示为一个快速排序的例子,图中的方括号表示待排序部分。;图9.7 快速排序;一趟快速排序采用从两头向中间扫描的办法。
假设原始数据已
文档评论(0)