java算法-快速排序

1、原理

    選擇一個關鍵值做爲基準值。比基準值小的都在左邊序列(通常是無序的),比基準值大的都在右邊(通常是無序的)。通常選擇序列的第一個元素。java

2、描述

    一次循環:從後往前比較,用基準值和最後一個值比較,若是比基準值小的交換位置,若是沒有繼續比較下一個,直到找到第一個比基準值小的值才交換。找到這個值以後,又從前日後開始比較,若是有比基準值大的,交換位置,若是沒有繼續比較下一個,直到找到第一個比基準值大的值才交換。直到從前日後的比較索引>從後往前比較的索引,結束第一次循環,此時,對於基準值來講,左右兩邊就是有序的了。重複上述循環。spa

3、實例

public class maxtest {
	public static void main(String[] args) {
		//###################快速排序法start###################//
		int[] state = {2,13,7,6,15,9,10,12,3,16,8,11,14,5,1};
		int start = 0;
		int end = state.length-1;
		System.out.print("初始值:");
		for (int i = 0; i < state.length; i++) {
			System.out.print(state[i]+",");
		}
		System.out.println("");
		
		sort(state,start,end);
		//###################快速排序法end###################//
	}
	
	public static int partition(int []array,int lo,int hi){
        //固定的切分方式
        int key=array[lo];
        while(lo<hi){
            while(array[hi]>=key&&hi>lo){//從後半部分向前掃描
                hi--;
            }
            array[lo]=array[hi];
            while(array[lo]<=key&&hi>lo){
                lo++;
            }
            array[hi]=array[lo];
        }
        System.out.println("");
    	for (int i = 0; i < array.length; i++) {
			System.out.print(array[i]+",");
		}
        array[hi]=key;
        return hi;
    }
    
    public static void sort(int[] array,int lo ,int hi){
        if(lo>=hi){
            return ;
        }
        int index=partition(array,lo,hi);
        sort(array,lo,index-1);
        sort(array,index+1,hi); 
    }
}

結果以下:code

初始值:2,13,7,6,15,9,10,12,3,16,8,11,14,5,1,

1,13,7,6,15,9,10,12,3,16,8,11,14,5,13,
1,2,5,6,3,9,10,12,9,16,8,11,14,15,13,
1,2,3,6,6,7,10,12,9,16,8,11,14,15,13,
1,2,3,5,6,7,8,9,9,16,12,11,14,15,13,
1,2,3,5,6,7,8,9,10,16,12,11,14,15,13,
1,2,3,5,6,7,8,9,10,13,12,11,14,15,13,
1,2,3,5,6,7,8,9,10,11,12,11,14,15,16,
1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,
1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,

圖列以下:排序

重複上述方式便可索引