快速排序对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序。
基本思想
通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
一趟排序过程如下:
具体代码
public class QuickSort { public static void main(String[] args) { // TODO Auto-generated method stub int[] list = {4,6,1,7,9,10,2,56,24,0,3}; QuickSort qs = new QuickSort(); qs.quickSort(list, 0, list.length-1); for(int i=0; i<list.length; i++){ System.out.print(list[i]+" "); } } public void quickSort(int[] list, int low, int high){ if(low < high){ int middle = getMiddle(list, low, high); quickSort(list, low, middle-1); quickSort(list, middle+1, high); } } public int getMiddle(int[] list ,int low, int high){ int tmp = list[low];//选择第一个数为枢轴 while(low < high){//使用一个索引由后往前遍历整个序列 while(low < high && list[high] > tmp){ high--; } list[low] = list[high]; while(low < high && list[low] < tmp){ low++; } list[high] = list[low]; } list[low] = tmp; return low; } }性能分析
在所有同数量级O(nlongn) 的排序方法中,其平均性能最好。就平均时间而言,是目前被认为最好的一种内部排序方法。
改进
枢轴选择
枢轴选择好坏直接影响快速排序的性能,最坏的情况是划分产生两个极端不对称的子序列(一个长度为1,另一个长度为n-1),此时复杂度为O(n*n)。可以选择首尾和中间元素中的中位数为枢轴,减小划分不对称的可能性。
原文地址:http://blog.csdn.net/hwwn2009/article/details/41787623