快速排序(算法导论学习)
Posted 作死的跑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序(算法导论学习)相关的知识,希望对你有一定的参考价值。
快速排序
算法描述
分解:数组A[p~r]被划分为两个子数组A[p~q]和A[q+1~r],使得A[q]大于等于A[p~q]中的每个元素,且小于等于A[q+1~r]中的每个元素。(需要说明的是,我们允许A[p~q]和A[q+1~r]为空)
解决:对子数组A[p~q]和A[q+1~r]递归的调用快速排序。
合并:因为子数组都是原址排序的,所以不需要合并操作,此时的A数组已经是排好序的
算法实现
func quickSort(a []int, q int, r int) {
if q > r {
return
}
i := partition(a, q, r)
quickSort(a, q, i-1)
quickSort(a, i+1, r)
}
func partition(a []int, q int, r int) int {
x := a[r]
i := q - 1
for j := q; j <= r-1; j++ {
if a[j] <= x {
i++
exchange(a, i, j)
}
}
exchange(a, i+1, r)
return i + 1
}
实现过程
int[] a = {1, 7, 3, 2, 16, 9, 10, 14, 8, 4};
quickSort(a,0,a.length-1);
q = 0;
r = 9;
//基准元素 x = a[r]
//x = 4
/**
partition
在 `i` 和 `j`的移动过程中将数组分为三个部分
i=-1 j =0
i j r-1 r
[1, 7, 3, 2, 16, 9, 10, 14, 8, 4]
j = 0 a[j] < x
交换 i++ a[i] a[j]的值
[1, 7, 3, 2, 16, 9, 10, 14, 8, 4]
j++
j = 1 a[j] > x
不进行操作
j++
i j
[1, 7, 3, 2, 16, 9, 10, 14, 8, 4]
j = 2 a[j] < x a = 0
交换 i++ a[i] a[j]的值
i j
[1, 3, 7, 2, 16, 9, 10, 14, 8, 4]
由此可看见
<=i 的值小于 x = a[r]
i< w <=j 的值 大于等于 x =a[r]
j< y < r 的值 都有可能
最后得到
[1 3 2 4 16 9 10 14 8 7]
返回 3
递归上面操作可排序完成
*/
以上是关于快速排序(算法导论学习)的主要内容,如果未能解决你的问题,请参考以下文章