8-3-数据结构——从概念到C++实现(第3版)-王红梅-清华大学出版社
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
数 据 结
构
(
从
概
解决方法:一趟排序没有交换,则表明整个序列已经有序。
念 到 实
现
)
清