当前位置:
文档之家› 数据结构-第10章-内部排序
数据结构-第10章-内部排序
独立的两部分,其中一部分记录的关键字均小于L,而另 一部分记录的关键字均大于等于L。分别对这两部分记录 继续进行排序,以达到整个序列有序 。 • 支点的选择方法
Kp1 Kp2 … Kpn 即使序列(※)成为一个按关键字有序的序列
{ Rp1,Rp2,…,Rpn} 这种操作过程称为排序。
5
基本概念
• 排序方法是稳定的 设 Ki=Kj( l i n,1 j n,i≠j),且在排序前
的序列中 Ri领先于 Rj(即 i<j),在排序后的序列中 Ri仍 领先于 Rj。
{ mid = (low+high)/2;
if (LT(L.r[0].key,L.r[mid].key)) high=mid-1;
else low=mid+1; }
for (int j=i-1; j>=high+1;--j) L.r[j+1]=L.r[j];
L.r[high+1]=L.r[0];
}
}
L. r[j+l]=L. r[j];
L. r[j+l]=L. r[0] ;
}
}
14
直接插入排序
• 例子
初始关键字:( 42 ) 41 33 67 74 23 37 33 i=2:(41) ( 41 42 ) 33 67 74 23 37 33 i=3:(33) ( 33 41 42 ) 67 74 23 37 33 i=4:(33) ( 33 41 42 67 ) 74 23 37 33 i=5:(33) ( 33 41 42 67 74 ) 23 37 33 i=6:(23) ( 23 33 41 42 67 74 ) 37 33 i=7:(37) ( 23 33 37 41 42 67 74 ) 33 i=8:(33) ( 23 33 33 37 41 42 67 74 )
7
排序方法分类
• 按排序时使用的原理 插入排序、交换排序、选择排序、归并排序、基数
排序。 • 按照所需的工作量
简单的排序方法,其时间复杂度为O(n2); 先进的排序方法,其时间复杂度为O(nlogn); 基数排序,其时间复杂度为O(d ·n)。
8
3. 基本操作 • 比较两个关键字的大小; • 将记录从一个位置移动至另一个位置。
折半插入排序是一个稳定的排序方法。
22
3. 希尔排序 (Shell’s Sort)
• 概念
希尔排序又称“缩小增量排序”(Diminishing Increment Sort) 属于插入排序类的方法,其时间效率上优于前述几种方法。
• 基本思想 先将整个待排记录序列分割成为若干子序列分别进行
直接插入排序,待整个序列中的记录“基本有序”时,再对 全体记录进行一次直接插入排序。
•排序方法是不稳定的 设 Ki=Kj( l i n,1 j n,i≠j),且在排序前
的序列中 Ri领先于 Rj(即 i<j),在排序后的序列中 Rj 领先于 Ri。
6
2. 排序方法分类
• 按照文件所处的位置不同: 内部排序 待排序记录存放在计算机内存中进行的排序过程。 外部排序 排序过程中有内、外存间信息的传递及交换的排序过程。
• 2-路插入排序
• 表插入排序
18
折半插入排序的算法10.2
void BInsertSort(SqList &L)
{ int low,high,mid;
for (int i=2;i<=L.length;++i)
{ L.r[0]=L.r[i];
low = 1; high=i-1;
while (low <= high)
次数为 n-1,对象移动次数为 0。
最坏情况下,排序前对象已经按关键字大小从大 到小有序(逆序),需比较和移动次数为多少?
16
直接插入排序
•时间复杂性分析
若待排序对象序列中出现各种可能排列的概率 相同,则可取上述最好情况和最坏情况的平均 情况。在平均情况下的关键字比较次数和对象 移动次数约为 n2/4。因此,直接插入排序的时 间复杂度为 o(n2)。
20
n 1
log 2 i 1 1 2 2 3 3
i1
20
21
22
4 4 k k
23
2 k 1
(1 2 2 2 2 k 1 ) ( 2 2 2 2 k 1 )
( 2 2 2 k 1 ) 2 k 1
k
k
k
2 j1
2 i 1 (1 2 2 k i )
第四 趟排 序后
13 27 38 49 49 65 76 97
第五 趟排 序后
13 27 38 49 49 65 76 97
第六 趟排 序后
29
冒泡排序的算法
Void bubble-sort(int a[],int n) for(I=n-1; change=TURE; I>1 && change; --I) { change=false; for (j=0;j<I;++j) if (a[j]>a[j+1]) { a[j] ←→a[j+1]; change=TURE} }
28
冒泡排序
• 例子
49 38 38 49 65 65 97 76 76 13 13 27 27 49 49 97
初始 关键 字
第一 趟排 序后
38 49 65 13 27 49 76 97
第二 趟排 序后
38 49 13 27 49 65 76 97
第三 趟排 序后
38 13 27 49 49 65 76 97
10
5. 排序方法分析
排序的时间开销: 排序的时间开销是衡量算法好坏的 最重要的标志。排序的时间开销可用算法执行中的数 据比较次数与数据移动次数来衡量。
一般都按平均情况进行估算。对于那些受对象关键字 序列初始排列及对象个数影响较大的,需要按最好情 况和最坏情况进行估算。
衡量排序方法的标准
排序时所需要的平均比较次数
直接插入排序是一种稳定的排序方法。
17
2. 其它插入排序
• 折半插入排序(Binary Insertion Sort)
折半插入排序基本思想是:设在顺序表中有一 个对 象序列 V[0], V[1], …, v[n-1]。其中,v[0], V[1], …, v[i-1] 是已经排好序的对象。在插入 v[i] 时,利用折 半搜索法寻找 v[i] 的插入位置。
交换排序的基本思想是两两比较待排序对 象的关键字,如果发生逆序(即排列顺序与 排序后的次序正好相反),则交换之,直到 所有对象都排好序为止。
26
1. 冒泡排序 (Bubble Sort)
• 基本思想 将第1个记录的关键字和第2个记录的关键字进行比较,
若为逆序(即r[1].key>r[2].key),则将两个记录交换之, 然后比较第2个记录和第3个记录的关键字。依次类推,直 至第n-1个记录和第n个记录的关键字进行过比较为止。第一 趟冒泡排序后,关键字最大的记录被放到最后一个记录的 位置上。
23
希尔排序
• 例子
例,初始关键字序列为:
43 41 33 67 74 23 37 33 47 35
d=5
43 23
41 37
33 33 67 47 74 35
一趟排序的结果:23 37 33 47 35 43 41 33 67 74
24
希尔排序
23 37 33 47 35 43 41 33 67 74
大家好
第10章 内部排序
讨论各种内部排序方法:插入排序、交换排序、 选择排序、归并排序和基数排序的基本思想、算法 特点、排序过程以及时间复杂性的分析。比较各种 内部排序方法。
2
目录
10.1 概述 10.2 插入排序 10.3 快速排序 10.4 选择排序 10.5 归并排序 10.6 基数排序 10.7 各种内部排序方法的比较讨论
15
直接插入排序
•时间复杂性分析
若设待排序的对象个数为L.length= n,则该算 法的主程序执行n-1趟。
关键字比较次数和对象移动次数与对象关键字的 初始排列有关。
最好情况下,排序前对象已经按关键字大小从小 到大有序,每趟只需与前面的有序对象序列的最 后一个对象的关键字比较 1 次,总的关键字比较
排序时所需要的平均移动
排序时所需要的平均辅助存储空间
11
10.2 插入排序
1. 直接插入排序 (Straight Insertion Sort)
• 概念 将一个记录插入到已排好序的有序表中,从而得到一
个新的、记录数增 1 的有序表。
例:已排序的一组记录排列如下: 12,33,45,57,76
现将关键字 40 记录插入上述序列中 12,33,40,45,57,76
• 算法10.1
void InsertSort(SqList &L){
for(i=2;i<=L.Length;++i)
if LT (L. r[i].key, L. r[i-1].key {
L. r[0]=L. r[i];
L. r[i]=L. r[i-1];
for (j=i-2; LT (L. r[0].key, L. r[j].key);- -j)
9
4. 存储结构
(1)以一维数组作为存储结构 (2)以静态链表作为存储结构(链表排序) (3)采用辅助表排序(地址排序)
待排序记录存储在数组中,同时另 设一个指示各个记 录存储位置的地址向量。在排序过程中不移动记录本身,而 移动地址向量中这些记录的 “地址”,排序结束后再按照地 址向量中的值调整记录的存储位置。
12