使用java实现归并排序
排序原理︰
1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。2将相邻的两个子组进行合并成一个有序的大组;
3.不断的重复步骤2,直到最终只有一个组为止。
排序图解
可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)
package Test;
import java.util.Arrays;
public class Demo08 {
public static void main(String[] args) {
// 归并排序
int[] arr = {10, 11, 9, 8, 7, 2, 3, 4, 5, 6, 23, 44, 33, 33};
Demo08 de = new Demo08();
de.sort(arr);
System.out.println(Arrays.toString(arr));
}
// 定义一个临时辅助数组
private static int[] temArray;
// 数组元素交换位置
private void ex(int[] arr, int i, int j) {
int temFront = arr[i];
arr[i] = arr[j];
arr[j] = temFront;
}
// 对整个数组元素进行排序
private void sort(int[] arr) {
//对临时数组进行初始化
temArray = new int[arr.length];
int lo = 0;
int hi = arr.length - 1;
sort(arr, lo, hi);
}
// 对部分数组元素进行排序
private void sort(int[] arr, int lo, int hi) {
if (lo >= hi) {
return;
}
int mid = lo + (hi - lo) / 2;
// 通过递归对原始数组进行分组
sort(arr, lo, mid);
sort(arr, mid + 1, hi);
//将有序子数组合并操作并将数组复制到原本数组当中
merge(arr, lo, mid, hi);
}
// 将有序子数组合并操作并将数组复制到原本数组当中
private void merge(int[] arr, int lo, int mid, int hi) {
// 定义辅助元素存放的初始位置
int index = lo;
// 定义两个指针变量分别代表左右指针
int p1 = lo;
int p2 = mid + 1;
// 将排好序的数组元素放入到临时数组当中
while (p1 <= mid && p2 <= hi) {
if (arr[p1] < arr[p2]) {
temArray[index++]=arr[p1++];
} else {
temArray[index++] =arr[p2++];
}
}
// 可能出现p1指针或者p2指针没有走完的情况
// 第一种情况p1没有走完
while (p1 <= mid) {
temArray[index++]=arr[p1++];
}
// 第二种情况p2指针没有走完
while (p2 <= hi) {
temArray[index++] =arr[p2++];
}
//将临时数组当中的有序数组复制到原本数组当中
for (int i = lo; i <= hi; i++) {
arr[i] = temArray[i];
}
}
}