java實現歸併排序和快速排序-分治法

以下兩個排序都是採用分而治之的方法。

快速排序

/**
 * 快速排序
 */
public class Test2 {
	public static void main(String[] args) {
		int a[] = {51, 46, 20, 18, 65, 97, 82, 30, 77, 50, 2};
		sort(a);
		System.out.println("排序結果:"+Arrays.toString(a));
	}
	
	private static void sort(int[] a) {
		quickSort(a, 0, a.length-1);
	}

	private static void quickSort(int[] a, int left, int right) {
		if(left >= right) {
			return ;
		}
		int temp;
		// 取第一個數爲基準值
		int base = a[left];
		int i = left;
		int j = right;
		while(i < j) {
			// 從右邊找 < 基準值的
			while(i<j && a[j] >= base) {
				j--;
			}
			// 從左邊找> 基準值的
			while(i<j && a[i] <= base) {
				i++;
			}
			// 交換這兩個值
			if(i < j) {
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
		// 交換 a[i] 和 基準值,這樣也就變成了  左邊的< 基準值  , 右邊的> 基準值
		a[left] = a[i];
		a[i] = base;
		// 遞歸比 
		quickSort(a, left, i-1);
		quickSort(a, i+1, right);
		
	}
}

歸併排序

/**
 * 歸併排序: 效率高,穩定;但是佔內存 分治 + 遞歸
 */
public class Test1 {
	public static void main(String[] args) {
		int a[] = { 51, 46, 20, 18, 65, 97, 82, 30, 77, 50, 2 };
		sort(a);
		System.out.println("排序結果:" + Arrays.toString(a));
	}

	private static void sort(int[] a) {
		mergeSort(a, 0, a.length - 1);
	}

	private static void mergeSort(int[] a, int left, int right) {
		// 取中間值
		int mid = left + (right - left) / 2;
		if (left < right) {
			// 拆左邊
			mergeSort(a, left, mid);
			// 拆右邊
			mergeSort(a, mid + 1, right);
			// 歸併[left - mid] 和[mid+1 - right]
			merge(a, left, mid, right);
		}

	}

	private static void merge(int[] a, int left, int mid, int right) {
		// 存放臨時歸併的結果
		int[] temp = new int[right - left + 1];
		int i = left;
		int j = mid + 1;
		int k = 0;
		// 歸併[left - mid] 和[mid+1 - right]
		while (i <= mid && j <= right) {
			if (a[i] < a[j]) {
				temp[k++] = a[i++];
			} else {
				temp[k++] = a[j++];
			}
		}

		// 兩個小數組歸併完後 數組後面還有值就直接追加到後面
		while (i <= mid) {
			temp[k++] = a[i++];
		}

		while (j <= right) {
			temp[k++] = a[j++];
		}

		// 將臨時數組的值 設置到數組的對應位置
		for (int z = 0; z < temp.length; z++) {
			a[z + left] = temp[z];
		}

	}

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