一、快速排序

学习快速排序需要先了解递归。递归函数最简单的描述就是:自己调用自己。

每个递归函数有两部分: 基线条件(base case和递归条件(recursive case)

递归条件:指的是函数调用自己;

基线条件指的是函数不再调用自己,从而避免形成无限循环。

快速排序使用分而治之(D&C:divide and comquer)的策略。

D&C是递归的,使用D&C解决问题包括两个步骤:

1、找出基线条件,这种基线条件必须尽可能简单

2、不断将问题分解(缩小规模),直到符合基线条件。

提示:涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素。陷入困境时,请检查基线条件是不是这样。

使用快速排序对数组进行排序。基线条件为:数组为空或只包含一个元素。步骤如下:

1、选择基准值

2、将数组分成两个数组:小于基准值的元素组成的子数组和大于基准值的元素组成的子数组。

3、对这两个子数组进行快速排序。

快排的性能高度依赖基准值,是不稳定算法。最佳情况和平均情况都是O(nlogn),最糟糕情况是O(n*n)。

快速排序算法的golang代码实现如下:

二、归并排序

  归并排序也叫合并排序,属于稳定排序算法时间复杂度是O(nlogn)空间复杂度为: O(n)。

假设集合一共有n个元素,算法将会对集合进行逐层的折半分组直到数组里只有一个元素,这时候才开始排序,让两个数组间排好序,依次按照递归的返回来把两个数组进行排好序,到最后就可以把整个数组排好序;

归并排序是一种效率较高的排序方法,它分为拆分合并两大部分,先拆后合。

拆分:就是将一堆无序的数拆成单个,方便合并

合并:就是将拆分好的数按照排序规则再拼凑起来。

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。但是很消耗空间,一般来说在内部排序不会用这种方法,而是用快速排序;外部排序才会考虑到使用这种方法

c是算法所需的固定时间量,被称为常量快速查找的常量比归并排序小,因此如果他们的运行时间都为O(nLogN),快速查找的速度将更快

测试部分: