快排

今天看算法题的时候遇到“找出数组中出现次数超过数组长度一般的数字”,需要用到快速排序,然而,又忘记了......

赶紧一点点回顾起来:(以后记得动手写代码,反复练习)

 快速排序:重点是求出基准记录所在的位置,效率O(N*logN)

http://blog.csdn.net/morewindows/article/details/6684558(参考了下这个博主的讲解,通俗易懂,更容易记住)

思想如下:

找到基准记录,以它为参考,一次排序之后,它的左边是比它小的数字,它的右边是比它大的数字。递归对左右的分别继续快排。

过程如下:(参考博文里边将它总结为“挖坑填数+分治算法”)

i,j,base

i:左边指针(向右移动,找比base大的数)i=Left

j:右边指针(向左移动,找比base小的数)j=Right

base:选择的基准数的值

1:i =L; j = R; 将基准数挖出形成第一个坑a[i];

2:j--由后向前找比base小的数,找到 挖出此数填  上一个坑  a[i],同时得到了新坑 a[j],否则继续j--;

3:i++由前向后找比base大的数,找到  挖出此数填 上一个坑 a[j],同时得到了新坑a[i],否则继续i--;

4:重复2,3步,直到i==j,将base填入a[i/j];

至此,原数组就在i/j处被分成两个子数组,i左边的都小于a[i],右边的都大于a[i]

 Note:快排的随机化版本与普通选择第一个数作为base的区别在于:只要将得到的随机数上的值和原数列第一个数交换即可。(当然涉及效率问题,之后研究)

代码如下:

原文地址:https://www.cnblogs.com/newcoder/p/5574784.html