今天看算法题的时候遇到“找出数组中出现次数超过数组长度一般的数字”,需要用到快速排序,然而,又忘记了......
赶紧一点点回顾起来:(以后记得动手写代码,反复练习)
快速排序:重点是求出基准记录所在的位置,效率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的区别在于:只要将得到的随机数上的值和原数列第一个数交换即可。(当然涉及效率问题,之后研究)
代码如下: