// 歸併排序算法, a是數組,n表示數組大小
public static void mergeSort(int[] a, int n) {
mergeSortInternally(a, 0, n-1);
}
// 遞歸調用函數
private static void mergeSortInternally(int[] a, int p, int r) {
// 遞歸終止條件
if (p >= r) return;
// 取p到r之間的中間位置q,防止(p+r)的和超過int類型最大值
int q = p + (r - p)/2;
// 分治遞歸
mergeSortInternally(a, p, q);
mergeSortInternally(a, q+1, r);
// 將A[p...q]和A[q+1...r]合併爲A[p...r]
merge(a, p, q, r);
}
private static void merge(int[] a, int p, int q, int r) {
int i = p;
int j = q+1;
int k = 0; // 初始化變量i, j, k
int[] tmp = new int[r-p+1]; // 申請一個大小跟a[p...r]一樣的臨時數組
while (i<=q && j<=r) {
if (a[i] <= a[j]) {
tmp[k++] = a[i++]; // i++等於i:=i+1
} else {
tmp[k++] = a[j++];
}
}
// 判斷哪個子數組中有剩餘的數據
int start = i;
int end = q;
if (j <= r) {
start = j;
end = r;
}
// 將剩餘的數據拷貝到臨時數組tmp
while (start <= end) {
tmp[k++] = a[start++];
}
// 將tmp中的數組拷貝回a[p...r]
for (i = 0; i <= r-p; ++i) {
a[p+i] = tmp[i];
}
}
// 快速排序,a是數組,n表示數組的大小
public static void quickSort(int[] a, int n) {
quickSortInternally(a, 0, n-1);
}
// 快速排序遞歸函數,p,r爲下標
private static void quickSortInternally(int[] a, int p, int r) {
if (p >= r) return;
int q = partition(a, p, r); // 獲取分區點
quickSortInternally(a, p, q-1);
quickSortInternally(a, q+1, r);
}
private static int partition(int[] a, int p, int r) {
int pivot = a[r];
int i = p;
for(int j = p; j < r; ++j) {
if (a[j] < pivot) {
if (i == j) {
++i;
} else {
int tmp = a[i];
a[i++] = a[j];
a[j] = tmp;
}
}
}
int tmp = a[i];
a[i] = a[r];
a[r] = tmp;
System.out.println("i=" + i);
return i;
}