学习快速排序需要先了解递归。递归函数最简单的描述就是:自己调用自己。
每个递归函数有两部分: 基线条件(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),快速查找的速度将更快。
测试部分: