- 1、本文档共130页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构
李云清 杨庆红 揭安全
人民邮电出版社
高等学校精品课程(省级)
国家十二五规划教材
高等学校精品课程(省级)
国家十二五规划教材
揭安全
jieanquan@163.com
江西师范大学计算机信息工程学院
第10章 内排序
交换排序
冒泡排序
快速排序
直接选择排序
堆排序
第十章 内排序
插入排序
直接插入排序
二分插入排序
希尔排序
选择排序
归并排序
基数排序
排序是数据处理过程中经常使用的一种重要的运算,排序的方法有很多种,本章主要讨论内排序的各种算法,并对每个排序算法的时间和空间复杂性以及算法的稳定性等进行了讨论。
10.1 排序的基本概念
假设一个文件是由n个记录R1,R2,…,Rn组成,所谓排序就是以记录中某个(或几个)字段值不减(或不增)的次序将这n个记录重新排列,称该字段为排序码。能唯一标识一个记录的字段称为关键码,关键码可以作为排序码,但排序码不一定要是关键码。
按排序过程中使用到的存储介质来分,可以将排序分成两大类:内排序和外排序。
内排序是指在排序过程中所有数据均放在内存中处理,不需要使用外存的排序方法。而对于数据量很大的文件,在内存不足的情况下,则还需要使用外存,这种排序方法称为外排序。
排序码相同的记录,若经过排序后,这些记录仍保持原来的相对次序不变,称这个排序算法是稳定的。否则,称为不稳定的排序算法。
评价排序算法优劣的标准 :
首先考虑算法执行所需的时间,这主要是用执行过程中的比较次数和移动次数来度量;
其次考虑算法执行所需要的附加空间。
当然,保证算法的正确性是不言而喻的,可读性等也是要考虑的因素。
/****************************************/
/*常见排序算法的头文件,文件名table.h */
/***************************************/
#define MAXSIZE 100 /*文件中记录个数的最大值*/
typedef int keytype; /*定义排序码类型为整数类型*/
typedef struct{
keytype key;
int other; /*此处还可以定义记录中除排序码外的其他域*/
}recordtype; /*记录类型的定义*/
typedef struct{
recordtype r[MAXSIZE+1];
int length; /*待排序文件中记录的个数*/
}table; /*待排序文件类型*/
void init(table *L) /*顺序表初始化函数*/
{ int i;
srand(time(NULL));
L-length=10;
for (i=1;i=10;i++)
L-r[i].key= rand(i)%100;
}
void print(table L) /*顺序表输出函数*/
{ int i,k=0;
for (i=1;i=L.length;i++)
{printf(%4d,L.r[i].key);
if (++k%10==0) printf(\n);
}
printf(\n);
}
/*顺序表文件输入函数*/
void input(table *L,char *f)
{int i;
FILE *fp;
fp=fopen(f,r);
if (fp)
{
fscanf(fp,%d,L-length);
for (i=1;i=L-length;i++)
fscanf(fp,%d,L-r[i].key);
}
else
L-length=0;
}
10.2 插入排序
插入排序的基本方法是:
将待排序文件中的记录, 逐个地按其排序码值的大小插入到目前已经排好序的若干个记录组成的文件中的适当位置,并保持新文件有序。
10.2.1 直接插入排序
直接插入排序算法的思路是:初始可认为文件中的第1个记录己排好序,然后将第2个到第n个记录依次插入已排序的记录组成的文件中。在对第i个记录Ri进行插入时,R1,R2,…,Ri-1已排序,将记录Ri的排序码keyi与已经排好序的排序码从右向左依次比较,找到Ri应插入的位置,将该位置以后直到Ri-1各记录顺序后移,空出该位置让Ri插入。
直接插入排序演示
49
25
21
49
25*
16
08
0 1 2 3 4
文档评论(0)