1. 程式人生 > >快速排序--java實現

快速排序--java實現

一次迴圈:從後往前比較,用基準值和最後一個值比較,如果比基準值小的交換位置,如果沒有繼續比較下一個,直到找到第一個比基準值小的值才交換。找到這個值之後,又從前往後開始比較,如果有比基準值大的,交換位置,如果沒有繼續比較下一個,直到找到第一個比基準值大的值才交換。直到從前往後的比較索引>從後往前比較的索引,結束第一次迴圈,此時,對於基準值來說,左右兩邊就是有序的了。

舉例:

待排序陣列:  2  4  6  3  1  5

第一次排序:   2  4  6  3  1  5  --->  2為基準值 向右比較

                  第一次交換後 :1  4  6  3  2  5         2>1   與1交換位置   開始向左比較

                  第二次交換後 :1  2  6  3  4  5         4>2   與4交換位置   開始向右比較    右邊無比2小的數,結束第一次排序

第二次排序:1  2  6  3  4  5        以2為界,前後拆開為兩個陣列,在進行第一次排序的形式進行排序。

                  1  與  6  3  4  5  兩個陣列

程式碼

public class QuickSort {
	
	/**
	 * 將陣列的某一段元素進行劃分,小的在左邊,大的在右邊
	 * @param a
	 * @param start
	 * @param end
	 * @return
	 */
	public static int partition(int[] a, int start, int end){
		//每次都以最右邊的元素作為基準值
		int base = a[end];
		//start一旦等於end,就說明左右兩個指標合併到了同一位置,可以結束此輪迴圈。
		while(start < end){
			while(start < end && a[start] <= base)
				//從左邊開始遍歷,如果比基準值小,就繼續向右走
				start++;
			//上面的while迴圈結束時,就說明當前的a[start]的值比基準值大,應與基準值進行交換
			if(start < end){
				//交換
				int temp = a[start];
				a[start] = a[end];
				a[end] = temp;
				//交換後,此時的那個被調換的值也同時調到了正確的位置(基準值右邊),因此右邊也要同時向前移動一位
				end--;
			}	
			while(start < end && a[end] >= base)
				//從右邊開始遍歷,如果比基準值大,就繼續向左走
				end--;
			//上面的while迴圈結束時,就說明當前的a[end]的值比基準值小,應與基準值進行交換
			if(start < end){
				//交換
				int temp = a[start];
				a[start] = a[end];
				a[end] = temp;
				//交換後,此時的那個被調換的值也同時調到了正確的位置(基準值左邊),因此左邊也要同時向後移動一位
				start++;
			}	
			
		}
		//這裡返回start或者end皆可,此時的start和end都為基準值所在的位置
		return end;
	}
 
	/**
	 * 排序--遞迴
	 * @param a
	 * @param start
	 * @param end
	 */
	public static void sort(int[] a, int start, int end){
		if(start > end){
			//如果只有一個元素,就不用再排下去了
			return;
		} 
		else{
			//如果不止一個元素,繼續劃分兩邊遞迴排序下去
			int partition = partition(a, start, end);
			sort(a, start, partition-1);
			sort(a, partition+1, end);
		}
			
	}

    public static void main(String[] args) {
	    int[] a = new int[]{2,7,4,5,10,1,9,3,8,6};
	    sort(a, 0, a.length-1);
	    System.out.println("排序後的結果:");
	    for(int i=0;i<a.length;i++){
		    System.out.print(a[i]+" ");
        }
    }
}