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