快速排序(算法导论学习)

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

递归上面操作可排序完成

*/




以上是关于快速排序(算法导论学习)的主要内容,如果未能解决你的问题,请参考以下文章

算法导论之所有排序算法的Python实现

算法排序之堆排序

算法导论学习笔记-归并排序

《算法导论》读书笔记

算法导论习题—堆排序快速排序

算法导论之快速排序