快速排序

快速排序利用分治的思想:
1.分解:數組A[p....r] 分爲 A[p....q -1] 和A[q + 1....r](可能有空的),使得前者的每一個元素都小於A[q],後者的每一個元素都大於A[q]。

2.解決:遞歸使用快速排序,對子數組A[p....q -1] 和A[q + 1....r]進行排序。
3.合併:因爲是原址排序,願意無需合併,A[p....r]已經有序。

參考代碼:
public class QuickSort {

	public static void main(String[] args) {
		int [] a= {2, 8, 7, 1, 3, 5, 6, 4};
		quickSort(a, 0, a.length - 1);
		System.out.println(Arrays.toString(a));
	}
	private static void quickSort(int[] a, int start, int end) {
		if(start < end){
			int q = partition(a, start, end);
			quickSort(a, start, q - 1);
			quickSort(a, q + 1, end);
		}	
	}
	private static int partition(int[] a, int p, int r) {
		int x = a[r];
		int i = p - 1;
		for(int j = p; j <= r - 1; j ++){//要注意是<=
			if(a[j] <= x){
				i = i + 1;	
				swap(a, i, j);
			}
			
		}
		swap(a, i + 1, r);
		return i + 1;
	}
	
	private static void swap(int [] a, int i, int j) {
		int temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}	
}

patition過程分析:
上面的表示下標,以最後一個爲參考值,i = - 1, j 從0開始

 01234567
28713564
A[0]就滿足,所以調換,但是此時i + 1 = 0,所以繼續往後,直到A[3]這一處,此時i + 1 = 1,所以結果是:
01234567
21783564
繼續找,A[4]也滿足if判斷要求,此時i + 1 = 2,結果是:
01234567
21387564
後面的都不滿足判斷條件,然後交換i + 1 = 3處和r= 7處的值。結果是:

01234567
2134756

8

那選取其他位置作爲這個參考值行麼?也是可以的,只要保證他之前的小於等於它, 後面的大於等於它。
故而在使用了一個隨機化的版本,即通過產生隨機數的形式。參考代碼:
private static int randomPartition(int[] a, int left, int right) {
	Random random = new Random();
	int i = random.nextInt(right - left) + left;
	swap(a, right, i);
	return partition(a, left, right);
	}

結果截圖:

參考:《算法導論》


以上就是這篇的內容了,如果您有什麼覺得改進的地方或者發現了錯誤的部分,請指出。謝謝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章