快速排序——凑活能用版
Posted rotk2015
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序——凑活能用版相关的知识,希望对你有一定的参考价值。
-
快速排序是排序的经典算法,具体思路很简单,但实现起来并非那么容易!
-
如果使用最直观的双指针法,总会遇到神奇的问题:low<high 还是 low<=high?!(我纠结一天了真的整不明白orz…)
-
所以为了珍爱生命,以后就用挖坑填数法吧。。。
-
代码如下:
import java.util.Arrays; public class QuickSort public static void sort(int[] input, int low, int high) while(low < high) // no need to process low==high since one element is ordered naturally. int i = partition(input, low, high); if(pivot > k) high = pivot - 1; else if(pivot < k) low = pivot + 1; else return; public static int partition(int[] input, int low, int high) int tmp = input[low]; // now we can write to input[low] directly since tmp save its val; while(low<high) // loop will be break IMMEDIATELY once low==high; while(low<high && input[high]>=tmp) high--; if(low<high) input[low] = input[high]; low++; while(low<high && input[low]<=tmp) low++; if(low<high) input[high] = input[low]; high--; // now low==high. input[high]=tmp; return high; public static void main(String[] args) int[] a = new int[]9,8,7,6,5,4,3,2,1; sort(a,0,a.length-1); System.out.println(Arrays.toString(a));
-
其中主体函数 sort()用递归实现,而 partition()则用了挖坑填数进行循环排序,实现简单,且最重要的是,边界条件都是一致的 low<high!!!
-
当然,此版本是基础版本,可改进的地方有:在排序前先随机打乱一下数组(避免pivot连续踩雷),三数取中选取pivot(尽量令pivot靠近中间),数据量小时使用插排,以及当有重复数据时,使用三分快排。
以上是关于快速排序——凑活能用版的主要内容,如果未能解决你的问题,请参考以下文章