分而治之(D&C) —— 快速排序

分而治之

一種不斷把大問題縮小,直至問題達到最小能解決
解決思路

  • 尋找基線條件。問題最小,最能方便解決問題的條件
  • 不斷把問題縮小,不斷接近基線條件。

ps:分而治之算法一般能使用遞歸進行實現

快速排序算法

快速排序算法是一種使用分而治之策略解決的算法

第一步:尋找基線條件

當排序的元素個數爲 0或1的時候,排序會變得很簡單,不需要進行排序就已經是排好順序的數組。因此選定基線條件爲 排序元素個數爲 0或1

  • 僞代碼
public int[] quickSort(int[] intArray) {
		if (intArray.length <= 1) {
			return intArray;
		}
		else {
			// 縮小問題接近基線條件
		}
	}

第二步:縮小解決的問題,逼近基線條件

逼近基線條件是數組不斷的減少,而且我們的目的是進行數組的排序。因此有人想到了排序的數組是由多個已經排好順序的數組組成,怎麼把這些已經排好序的數組連在一起,於是想出了基準點,(從大到小排序)比基準點小的排在右邊,大的排到座標。快速排序的思路如下:

  1. 隨機找一個基準點
  2. 按基準點把大數組分爲小數組,左大右小
  3. 利用 左大右小 的數組重複步驟 1。直至達到基線條件: 數組元素爲空或1

Java實現代碼

public Integer[] quickSort(Integer[] intArray) {
		if (intArray.length <= 1) {
			return intArray;
		}
		else {
			// 縮小問題接近基線條件
			int baseNumber = intArray[0];
			ArrayList<Integer> greaterArrList = new ArrayList<Integer>();
			int greatNum = 0, lessNum = 0;
			ArrayList<Integer> lessArrList = new ArrayList<Integer>();
			for (int i=1; i<intArray.length; i++) {
				int ele = intArray[i];
				if (ele > baseNumber) {
					greaterArrList.add(ele);
					greatNum++;
				}
				else {
					lessArrList.add(ele);
					lessNum++;
				}
			}
			
			// return quickSort(greaterArr) + [baseNumber] + quickSort(lessArr)
			Integer[] greaterArr = new Integer[greatNum];
			Integer[] lessArr = new Integer[lessNum];
			greaterArr = greaterArrList.toArray(greaterArr);
			lessArr = lessArrList.toArray(lessArr);
			
			Integer[] sortArr = new Integer[intArray.length];
			Integer[] greaterSort = quickSort(greaterArr);
			Integer[] lessSort = quickSort(lessArr);
			for (int i = 0; i < greaterSort.length; i++) {
				sortArr[i] = greaterSort[i];
			}
			sortArr[greatNum] = baseNumber;
			for (int i = 0; i < lessSort.length; i++) {
				sortArr[greatNum + 1 + i] = lessSort[i];			
			}
			return sortArr;
		}

拓展:求和 Sum(n) = 1+2+3+4+....+n 使用 分而治之

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