题:已知一组键值序列(3,6,8,9,2,7,4,3),试采用快速排序法对该组序列作升序排序,并给出每一趟的排序结果。
答案:
请问大牛,这个解题过程是怎么推导的啊?我从书上看,书上说是用low high重叠法,任意选一个中间值,然后每次把小于中间值的放左边,大于中间值的放右边。 感觉和标准答案的解法对不起来啊。请问这个解法如何推导?为什么这样写?
题:已知一组键值序列(3,6,8,9,2,7,4,3),试采用快速排序法对该组序列作升序排序,并给出每一趟的排序结果。
答案:
请问大牛,这个解题过程是怎么推导的啊?我从书上看,书上说是用low high重叠法,任意选一个中间值,然后每次把小于中间值的放左边,大于中间值的放右边。 感觉和标准答案的解法对不起来啊。请问这个解法如何推导?为什么这样写?
15 回答8.4k 阅读
8 回答6.2k 阅读
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
答案的交换算法
以下用加粗表示low的位置,
红色
表示high的位置,初始 3,6,8,9,2,7,4,
3
tmp
表示)tmp
, 将它的值赋给low指向的位置,(如果当high=low时还没找到则停止)得到 2,6,8,9,
2
,7,4,3tmp
,将它的值赋给high指向的位置,(如果当high=low时还没找到则停止)得到 2,6,8,9,
6
,7,4,33
,8,9,6,7,4,3, 此时low指向的值
3
已经在正确的位置上,以low为分界得到两个子序列2和8,9,6,7,4,3所谓的low high重叠法大概就是指这个
以下可能是废话
答案的实现是选择序列的第一个元素作为中间值
排序过程是递归进行的,对一个序列作一层递归调用后, 会得到两个序列(可能为空),需要再对两个子序列做同样的操作,直到子序列的长度为0或1。
对于题中的序列,第一层递归选择3作为中间值,得到的两个子序列分别为2 和 8,9,6,7,4,3,左边序列只有一个元素,不需要递归下去了,右边序列需要进行第二层递归。选择子序列的第一个值也就是8作为中间值,得到3,4,6,7和9两个子序列";然后继续对左边序列做递归操作……
至于为什么得到的子序列的顺序是这个样子, 这跟交换的算法有关