8-3-数据结构——从概念到C++实现(第3版)-王红梅-清华大学出版社

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

temp = data[j]; data[j] = data[j+1]; data[j+1] = temp;
出 版 社
exchange = j;
//记载每一次记录交换的位置
}
}
}
时间性能
void Sort :: BubbleSort( )
{
int j, exchange, bound, temp;
5
现 )



5
学 出 版

i1
2
1
2
3
4
5
平均情况:随机排列,O(n2)
空间性能
r[0]作用是什么?
暂存单元
空间性能:O(1) 稳定性:稳定
r[0] r[1] r[2] r[3] r[4] r[5]
5
4
3
2
5*




4
3
2
5
5*
( 从







if (data[j] > data[j+1]) {
第八章 v 排序技术
8-3-1 起泡排序
基本思想
起泡排序的基本思想:两两比较相邻记录,如果反序则交换,直 到没有反序的记录为止。



反序则交换
构 (
r1
r2

ri-1 ri ri+1

rn
从 概 念 到



无序区
有序区
清 华 大




类似水中的气泡,体积大的浮到上面,起泡排序因而得名
运行实例
关键问题
交换 交换
待排序序列
12
20
10
18
24

第一趟排序结果
12
10
18
20
24
据 结 构 (


解决方法:设置变量exchange记载交换的位置,一趟排序后exchange记载的
念 到 实

就是最后交换的位置,从exchange之后的记录不参加下一趟排序。
) 清


算法描述: if (data[j] > data[j+1]){
念 到 实

上一趟起泡排序的最后交换的位置exchange之间的关系是bound = exchange。
) 清

算法描述:
bound = exchange; exchange = 0;
大 学

for (j = 0; j < bound; j++)
版 社
if (data[j] > data[j+1]){

rn
概 念 到
待排序序列
8
12
20
10
18
24
第一趟排序结果 8 第二趟排序结果 8 第三趟排序结果 8 第四趟排序结果 8
第第
12
10
18
20
24


数 据


结 构 (
10
12
18
20
24



概 念



实 现 )
10
12
18
20
24


清 华 大


学 出 版
10
12
18
20
24
要要 社
吗吗
第五趟排序结果 8
学 出 版
temp = r[j]; r[j] = r[j+1]; r[j+1] = temp;

exchange = j;
}
如果有多个记录位于最终位置,如何不参加下一趟排序?
关键问题
交换 交换
待排序序列
12
20
10
18
24

第一趟排序结果
12
10
18
20
24
据 结 构 (


解决方法:设置变量bound表示一趟起泡排序的范围[1, bound],并且bound与
10
12
18
20
24 ? ?
运行实例
待排序序列
8
12
20
10
18
24
第一趟排序结果 8
12
10
18
20
24
数 据



第二趟排序结果 8
10
12
18
20
24
从 概 念 到 实


第三趟排序结果 8
10
12
18
20
24
清 华 大 学 出


一趟起泡排序可以确定多个记录的最终位置
一趟起泡排序没有记录交换,则结束排序过程
数 据

while (exchange != 0)
构 (
{
从 概 念
bound = exchange; exchange = 0;
到 实 现
for (j = 0; j < bound; j++) //一趟起泡排序的区间是[0~bound]
) 清
if (data[j] > data[j+1]) {
华 大 学
) 清
if (data[j] > data[j+1]) {
华 大 学
temp = data[j]; data[j] = data[j+1]; data[j+1] = temp;
出 版 社
exchange = j;
}
}
}
时间性能
最好情况:正序 O(n)
比较次数:n-1次 移动次数:0次
1
2
3
4
5
1
2
华 大 学
temp = r[j]; r[j] = r[j+1]; r[j+1] = temp
出 版

exchange = j;
}
第八章 v 排序技术
8-3-2 快速排序
改进的着眼点
5
4
3
21Biblioteka 45数据

记录的比较在相邻单元中进行
3
5
构 ( 从 概





每次交换只能右移一个单元
2
5
清 华 大



算法描述:
while (exchange != 0) {
大 学 出 版 社
执行一趟起泡排序;
}
如何判别起泡排序的结束?
C++实现
void Sort :: BubbleSort( )
{
int j, exchange, bound, temp;
exchange = length - 1;
//第一趟起泡排序的区间是[0~length-1]
3
4
5












清 华 大 学 出 版 社
时间性能
最好情况:正序 O(n)
比较次数:n-1次
5
4
3
2
1

移动次数:0次


4
3
2
1
5
构 ( 从

最坏情况:逆序 O(n2)
念 到

n1
比较次数: n i
n(n 1)

3
i1
2
n1
移动次数: 3(n
i)
3n(n
1)

2
2 1
1 3
4 4
exchange = length - 1;
比较语句?执行次数?
数 据

while (exchange != 0)
构 (
{
移动语句?执行次数?
从 概 念
bound = exchange; exchange = 0;
到 实 现
for (j = 0; j < bound; j++)
取决于待排序序列的初始状态


总的比较次数和移动次数较多
1
5
较大记录从前面直接移到后面,较小记录从后面直接移到前面?
基本思想
快速排序的基本思想:选一个轴值,将待排序记录划分成两部分,
左侧记录均小于或等于轴值,右侧记录均大于或等于轴值,然后
分别对这两部分重复上述过程,直到整个序列有序。
数 据




r1

ri-1 ri ri+1
temp = r[j]; r[j] = r[j+1]; r[j+1] = temp;
下一趟排序的范围是多少?
exchange = j; }
关键问题
某趟排序结果
10
12
18
20
24
下一趟排序结果
10
12
18
20
24
数 据 结




解决方法:一趟排序没有交换,则表明整个序列已经有序。
念 到 实



相关文档
最新文档