随机化快排(1)

来源:互联网 发布:淘宝韩版女装店铺装修 编辑:程序博客网 时间:2024/05/15 16:15

快速排序是一个经常使用的排序算法,其名字直接显示了它的优势—快速。

 

然而,快速排序的最坏情况效率和插入排序冒泡排序等低级排序一样慢。

 

尴尬,一个叫做快速排序的排序速度竟然会和最垃圾的排序速度差不多。

 

然而,快速排序的应用还是非常广的。

 

随机化快速排序就是一种方法使得快速排序能够快速运行的一种机制。

 

快速排序的讲解

(1)    快速排序的基本思想

(2)    一个C语言实现

(3)    讨论速度慢的原因以及对快排的性质进行简单了解

(4)    随机化算法

(5)    随机化快速排序

 

快速排序的基本思想:

因为快速排序是一种递归算法,所以描述起来是很轻松的。

基本思路如下:从待排序列中选出一个元素作为枢纽元x,将剩余序列分为两部分,一部分为小于枢纽元的A,另一部分为大于枢纽元的B。然后对序列A和序列B分别使用快速排序。

 

图示如下

 

原始序列包含七个元素,分别为28,12,47,84,4,47,88,63

现在我们选取第一个元素作为枢纽元也就是28,得到两个子序列A,B

A 12 4

B 47 84 47 88 63

A中元素都是小于枢纽元28的数,而B中都是大于28的数。


最后,我们对A序列和B序列重复上述的工作也就完成了快速排序了。

 

可以说快速排序是那么多排序当时思路最简洁的一个算法了。前几次的推文中讲了很多关于递归方面的东西,因为快速排序是一个递归算法,下面从递归的角度简单描述此算法。

 

快速排序是符合典型的分治法(divide and conquer)的

 

分:

       为了能够解决排序问题,快速排序先取出一个枢纽元。

       以此枢纽元作为标准,划分出两个序列A,B,一组小于它,一组大于它。

解决:

       对序列A,B递归快速排序

合并:

       无

 

快速排序随是一个典型的递归算法。不过它有一个很独特的地方,所有的处理都集中在了分解前的比较过程中(就是分出A和B),所以最后的合并没有任何操作。

 

接下来,我们看一下快速排序的递归底层。

 

之前说过,没有递归底层一个递归过程是会走向无穷递归的,因此即使没有合并算法,快排一定有递归底层。

 

快排的递归底层即是序列只有一个元素或者没有元素。举个栗子,分解出来的A和B子序列中,A序列只有一个元素,那么递归A的时候就应该直接返回,这样也就是一个递归底层了。没有元素的栗子在下次再举吧,因为这个具体的实现有关系。

0 0
原创粉丝点击