一:快排

本节开始对算法进行一下复习与讨论,先来看一下排序算法


一:快排_第1张图片


本节来玩一下快排!

快速排序的算法思想最初是由,一个名叫C.A.R.Hoare提出的,他给出的算法思想描述的具体版本,如下:

HOARE-PARTITION(A, p, r)

1  x ← A[p]

2  i ← p - 1

3  j ← r + 1

4  while TRUE

5      do repeat j ← j - 1

6           until A[j] ≤ x

7         repeat i ← i + 1

8           until A[i] ≥ x

9         if i < j

10            then exchange A[i] ↔ A[j]

11            else return j

后来,又有不少的类似变种。

在平均状况下,排序N个项目要O(nlogn)次比较,最坏则是O(n^2)。事实上,快排通常会比其他O(nlogn)的算法更快,因为他的内部循环可以在大部分的架构上很有效率的被实现出来!快排使用分治策略把一个串行分为两个子串行: 1:分解  2:解决  3:合并,所以递归的主要思想是递归与划分!


下面给出算法步骤:

1.从数列中挑出一个元素,称之为“基准”

2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的放在基准值后面(相同的数可以放到任意一边)。在这个分区退出之后,该基准就处于数列的中间位置。

3.递归的把小于基准的元素的子数列和大于基准的元素的子数列排序


注:递归的最底部情形,是数列的大小是0或者是1,也就是永远都已经被排序完成。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代中,它至少会把一个元素摆到它最后的位置上去。

下面给大家贴上一个动态的图片来了解一下其原理:


一:快排_第2张图片

现在对于快排的算法的描述有了很多的改进版本,但是不管怎么变,他的基本的思想还是没有改的。大家可以先根据自己的理解写一下快排的代码实现,明天我会在贴上几个版本的快排的代码和大家一起来学习!


@软件二叔 ,转载请注明出处。欢迎大家评论转载,一起学习,一起进步,加油!


你可能感兴趣的:(一:快排)