首页 > 代码库 > java实现快速排序

java实现快速排序

快速排序对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序。

基本思想

通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

一趟排序过程如下:


具体代码

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)。可以选择首尾和中间元素中的中位数为枢轴,减小划分不对称的可能性。


java实现快速排序