d10-2009

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

typedef struct { RedType r[ MAXSIZE + 1 ]; // r[0]闲置或作哨兵 int length; } SqList;
8
10.2 插入排序—直接插入排序
► 直接插入排序
在插入第 i(i>1)个记录时,前面的 i-1个 记录已经排好序。
r1 r2
„„
ri-1
ri
1
10.1 排序概述
► 排序:将一个数据元素(记录)的任意序列,重新
排列成一个按关键字有序的序列。 设:R1,R2,R3,…,Rn 是n个记录,k1,k2, k3,…,kn 为它们的关键字,排序就是将记录按关 键字递增(或递减)的次序排列起来。 ► 常见的排序结果 递 增:ki < ki+1 递 减:ki > ki+1 非递减:ki ≤ ki+1 非递增:ki ≥ ki+1
49)65
65 65 49
97
76
76
13
13 13
27
27 27 27
49
49 49 49 49
65)97 76 65
97)76 76
97)13
97)27
i=7:
i=8:
(27)(13
(49)(13
27
27
38
48
49
49
65
49
76
65
97)49
76 97)
11
10.2 插入排序—直接插入排序
19
10.3 交换排序—起泡排序
► 交换排序的基本思想
交换排序的主要操作是交换。 在待排序列中选两个记录,将它们的关键码相比 较,如果反序(即排列顺序与排序后的次序正好相 反),则交换它们的存储位置。
反序则 交换
ri
rj
20
10.3 交换排序—起泡排序
► 起泡排序
两两比较相邻记录的关键码,如果反序则交换,直到 没有反序的记录为止。
6
10.1 排序概述
► 稳定排序的应用
例:股票交易系统。考虑一种股票交易 1) 顾客委托:股票编码、价格、数量、买/卖 2) 交易原则 - 价格高者先成交 - 价格相同,按时间顺序成交
委托队列(反映委托提交的时间先后) ((09,10),(06,10.5),(033,9.8),(051,10)) 按价格排序 ((06,10.5),(09,10),(051,10),(033,9.8))
减少总的比较次数和移动次数 增大记录的比较和移动距离
较大记录从前面直接移动到后面 较小记录从后面直接移动到前面
25
10.3 交换排序—快速排序

基本思想:通过一趟排序将待排记录分割成独立的 两部分,其中一部分记录的关键字均比另一部分记录 的关键字小。然后分别对这两部分记录继续进行排序, 以达到整个序列有序。 一趟快速排序:首先选取一个记录(通常选取第一个 记录)作为界点,然后将所有关键字中比它小的记录 都安置在它的位置之前,将所有关键字比它大的记录 都放在它的位置之后。 由此,以该“界点”记录最后所落的位置 i 为分界线, 将整个序列分割成两个子序列。
n 平均复杂度 O(n2)
13
n
10.2 插入排序—折半插入排序
如何改进直接插入排序?
在插入第 i(i>1)个记录时,前面的 i-1 个记录已经排好序,在寻找插入位置时,可 以用折半查找来代替顺序查找,从而减少比 较次数。
折半插入排序基本思想: 用折半查找方法确定插入位置的排序。
14
10.2 插入排序—折半插入排序
97
76
13
65 high
49
30
10.3 交换排序—快速排序
► 一趟快速排序的过程
pivotkey = 49
0 1 2 3 4 5 6 7 8
第三次交换
27
38
13 low
97
76
13 high
65
49
0
1
2
3
4
5
6
7
8
第四次交换
27
0 1
38
2
13
3
97 low
rj
反序则交换
rj+1 ri+1 ≤ …… ≤ rn-1 ≤rn
有序区 已经位于最终位置
22
无序区 1≤j≤i-1
10.3 交换排序—起泡排序
例: 初始关键字: 49 38 49 49 49 13 65 65 65 13 27 97 76 13 27 49 76 13 27 49 49 13 27 49 65 27 49 76 49 97
10.2 插入排序—希尔排序
由于在前两趟的插入排序中,记录的关键字是 与同一子序列中的前一个记录的关键字进行比较, 因此关键字较小的记录不是一步一步的往前挪动, 而是跳跃式的往前移。 在进行最后一趟增量为1的插入排序时,序列 已基本有序,只要作记录的少量比较和移动即可完 成排序。因此比直接插入排序快。 希尔排序算法是不稳定的排序算法。
• 算法实现 Status InsertSort ( SqList &L ) { for( i=2; i<=L.length; ++i ) if ( LT( L.r[i].key, L.r[i-1].key ) ) { L.r[0].key = L.r[i].key; //设置哨兵 for(j=i-1; LT(L.r[0].key,L.r[j].key); --j) L.r[j+1] = L.r[j]; //记录后移 L.r[j+1] = L.r[0]; //插入到正确位置 } } //InsertSort

29
10.3 交换排序—快速排序
► 一趟快速排序的过程
pivotkey = 49
0 1 2 3 4 5 6 7 8
初始关键字
49 low
0 1
38
65
97
76
13
27
49 high
2
3
4
5
6
7
8
第一次交换
27 low
0 1
38
2
65
3
97
4
76
5
13
6
27
49
8
high
7
第二次交换
27
38
65 low
4
10.1 排序概述
► 排序分类
按排序所需工作量 ►简单的排序方法:T(n)=O(n² ) ►先进的排序方法:T(n)=O(nlogn) ►基数排序:T(n)=O(d.n)
► 排序基本操作
比较两个关键字大小。 将记录从一个位置移动到另一个位置。
5
10.1 排序概述
► 评价排序的性能——稳定性
28
10.3 交换排序—快速排序
一趟快速排序算法 int Partition ( SqList &L, int low, int high ) { L.r[0] = L.r[low]; pivotkey = L.r[low].key; while ( low < high ) { while ( low<high && L.r[high].key>=pivotkey ) -- high; L.r[low] = L.r[high]; while ( low<high && L.r[&&].key<=pivotkey ) ++ low; L.r[high] = L.r[low]; } L.r[low] = L.r[0]; // 枢轴记录到位 return low; // 返回枢轴的位置 } // Partition
7
10.1 排序概述
#define MAXSIZE 20 // typedef int KeyType; // typedef struct { KeyType key; InfoType otherinfo; // } RedType; // 顺序表的最大长度 定义关键字类型 // 关键字 其他数据项 记录类型
快速排序
27
10.3 交换排序—快速排序
► 具体算法:
设两个指针 low 和 high,其初值分别指向数组的 元素1和元素n。 选第 1 个记录为枢轴,关键字为pivotkey。 将 pivotkey 复制到 r[0] 中,从 high 所指的位置起 向前 搜索找到第一个关键字 小于pivotkey的记录,复 制到 low 所指位置中;然后从 low 所指位置起向后搜 索,找到第一个关键字 大于 pivotkey的记录,复制到 high所指位置中。 重复这两步直到 low=high 为止。
26
10.3 交换排序—快速排序

基本思想
选定一记录,以它的关键字作为“枢轴”,关键字小 于枢轴的记录移至该记录之前;关键字大于枢轴的记 录移至该记录之后。 记录序列 R[s..t] 被分割成两部分:R[s..i-1]和 R[i+1..t];继续对R前后两部分记录进行快速排序。
无序序列 一次划分 无序子序列1 快速排序 枢轴 无序子序列2
第一趟排序后:38 第二趟排序后:38 第三趟排序后:38 第四趟排序后:38
第五趟排序后:13
第六趟排序后:13
27
27
38
38
49
逐步有序
24
10.3 交换排序—快速排序
► 快速排序
在起泡排序中,记录的比较和移动是在相邻单元中进 行的,记录每次交换只能上移或下移一个单元,因而 总的比较次数和移动次数较多。
ri+1
„„
rn
有序序列 r'1 r'2
„„
无序序列 r'i-1 r'i ri+1
„„
rn
10
10.2 插入排序—直接插入排序
► 直接插入排序
L.r[0]
[初始关键字]:
(49)38 49 49 49 38
65
97
76
13
27
49
i=2:
i=3: i=4: i=5: i=6:
(38)(38
(65)(38 (97)(38 (76)(38 (13)(13
稳定的排序方法:设在排序前的序列中记录 Ri 领 先于 Rj(即 i<j ),且 Ri、Rj 对应的关键字为 Ki、 Kj,如果 Ki=Kj 并且在排序后的序列中 Ri 仍领先 于 Rj,称所用方法是稳定的。 不稳定的排序方法:排序后的序列中Rj领先于Ri。
待排序列:49,38,65,97,76,13,27,49 排序后: 13,27,38,49,49,65,76,97 — 稳定 排序后: 13,27,38,49,49,65,76,97—不稳定
16
10.2 插入排序—希尔排序
► 具体实现办法
先取一个正整数 d1<n,把所有相隔d1 的 记录放一组,组内进行直接插入排序; 然后取 d2<d1,重复上述分组和排序操作; 直至 di=1,即所有记录放进一个组中排序 为止。
wenku.baidu.com
17
10.2 插入排序—希尔排序
► 希尔排序实例
假设:d1=5,d2=3,d3=1。 [初始关键字]: 49 38 65 97 76 49 38 65 97 76 一趟排序结果: 13 27 49 55 04 13 55 27 04 49 二趟排序结果: 13 04 49 38 27 三趟排序结果: 04 13 27 38 49 13 27 49 55 04 13 27 49 55 04 49 38 65 97 76 38 76 65 49 97 49 55 65 97 76 49 55 65 76 9718
2
10.1 排序概述
► 排序分类
按照排序记录所在的位置分
►内部排序:待排序记录存放在计算机随机存
储器中(内存)进行排序过程。
►外部排序:待排序记录数量很大,内存无法
一次容纳全部记录,在排序过程中尚需对外存 进行访问的排序过程。
3
10.1 排序概述
► 排序分类
按照排序依据的原则分 ►插入排序:直接插入排序、折半插入排序、 希尔排序 ►交换排序:冒泡排序、快速排序 ►选择排序:简单选择排序、堆排序 ►归并排序:2-路归并排序 ►基数排序
直接插入排序算法是稳定的
12
10.2 插入排序—直接插入排序
• 直接插入排序算法性能分析
最好的情况(正序序列) n
“比较”次数= 1 = n-1
i=2
“移动”次数= 0 最坏的情况(逆序序列)
(n +2)(n - 1) “比较”次数= i = 2 i=2
n
=
(n+4)(n-1) “移动”次数 2+( i-1) = ( i+1) 2 i=2 i=2

i=1 (30) 13 70 85 39 42 6 i=2 13 (13 30) 70 85 39 42 6 20 20 …
i=7 6
(6
s s
13
13
30 39
30
m
j
42 70 85 ) 20
42 70 85 ) 20
j
i=8 20 (6
39
m
i=8 20 (6 i=8 20 (6
i=8 20 (6
13 13
13
j
30 39 30 39
j s m s
42 70 85 ) 20 42 70 85 ) 20
42 70 85 ) 20
30
39
i=8 20 (6
13
20 30
39
42 70
85 )
15
10.2 插入排序—希尔排序
► 希尔排序基本思想
将整个待排记录序列分割成为若干子序列分别进行直 接插入排序,待整个序列中的记录“基本有序”时, 再对全体记录进行一次直接插入排序。 子序列的构成不是简单的“逐段分割”,而是将 相隔某个“增量”的记录组成一个子序列。
相关文档
最新文档