以下兩個排序都是採用分而治之的方法。
快速排序
/**
* 快速排序
*/
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];
}
}
}