赞
踩
快速排序具体是在序列中选择一个元素(如何选择没有规定),接下来通过"遍历的方式",比较所选定的元素和区间内其他元素的大小关系。
快排:
1) 如果区间内的元素个数<=1,则不用做任何处理,因为天然有序
2)从区间中(这里的区间不代表整个数组,所以需要通过[from,to]来限定)中挑选一个pivot,挑选方式随意
3)遍历区间,将每个元素都和pivot进行比较,并且进行必要的位置移动,是的完成区间遍历之后,整个数组被分成三个小区间,【<= pivot】【pivot】【>=pivot】 整个过程一般称为partition。
如图所示,所选定的pivot = 7,经过遍历比较之后,就被分成大于7和小于7 的两个区间,此时就变成两个小问题(问题性质一样,都是排序,但是数据规模在明显降低),在两个小区间继续进行上述操作
partition的几种方式(所讨论的区间,很大可能是处于原始数组中间的一段区间,array中的[from,to] from不一定是0,虽然一开始是0,同理。to很大概率也不是array.length - 1,虽然一开始是array.length- 1)
PartitionA:
首先确定pivot,然后是 array[left] 与 pivot 进行比较,如果 array[left] < pivot,left就向右走一步,然后下一个值与pivot比较,直到array[left] > pivot,此时比较结束;同理array[right]与pivot比较,array[right] > pivot,array[right]向左走一步,直到array[rigth] < pivot 比较结束。此时交换array[left] 和 array[right],继续重复以上步骤直至 left == right,比较结束,交换 left 和 to,此时第一次partition结束
PartitionB:
最开始 to == right ,array[to] = pivot 然后array[left]与pivot比较,array[left] <= pivot,left向右走,然后 array[right] = array[left];同理 array[right]与pivot比较,array[right] >= pivot,right向左走,接着array[left] = array[right],循环比较直到所有元素完成比较,一次partition完成。
代码如下:
- private static int partitionMethodA(long[] array, int from, int to) {
-
- long pivot = array[to];
- int left = from;
- int right = to;
- while (left < right) {
-
- while (left < right && array[left] <= pivot) {
- left++;
- }
-
- while (left < right && array[right] >= pivot) {
- right--;
- }
-
- long t = array[left];
- array[left] = array[right];
- array[right] = t;
- }
-
- long t = array[to];
- array[to] = array[left];
- array[left] = t;
-
- return left;
- }
-
-
-
-
-
- private static int partitionMethodB(long[] array, int from, int to) {
- long pivot = array[to];
- int left = from;
- int right = to;
-
- while (left < right) {
- while (left < right && array[left] <= pivot) {
- left++;
- }
- array[right] = array[left]; // 这里
-
- while (left < right && array[right] >= pivot) {
- right--;
- }
- array[left] = array[right]; // 这里
- }
-
- array[left] = pivot; // 这里
-
- return left;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。