閉着眼睛寫出三路快排(java)

閉着眼睛寫出三路快排(java)

思路:快速排序的核心通過基準值進行比較,小於基準值v的放在左邊,大於的放在右邊,從而得出基準值的正確位置。
因此,將一段數組(下標範圍:[l,r])選出基準值v後(這裏默認基準值爲第一個元素)用i遍歷,分成四個部分,小於它的[l, lt],等於它的[lt+1, i -1],還未遍歷到的[i, rt-1],大於它的[rt,r]:如下所示
[l,…lt],[lt+1,…,i-1],i,…,[rt,…,r]

//直接展示尋找基準值的核心代碼,由於三路快排考慮到等於基準值的情況,
//因此返回的是值爲V的兩邊不爲v的兩個值,這裏用數組返回
public int[] partition(int[] a, int l, int r) {
	//基準值
	int v = a[l]
	//遍歷索引,l是基準值,直接從l+1開始遍歷
	int i = l + 1;
	int lt = l;
	int rt = r + 1;

	while (i < rt) {
		if (a[i] < v) {
			swap(a,lt+1,i);
			lt++;
			i++;
		}else if (a[i] > v) {
			swap(a,rt-1.i);
			rt--;
		}else {
			i++;
		}
	}
	
	swap(a,l,lt);
	return new int[]{lt,rt};
}

Java源碼中基準值的選取:
當數組大小爲 size=7 時 ,取數組中間元素作爲劃分元。
當數組大小 7<size<=40時,取首、中、末三個元素中間大小的元素作爲劃分元。
當數組大小 size>40 時 ,從待排數組中較均勻的選擇9個元素,選出一個僞中數做爲劃分元。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章