归并排序
归并排序先将数组递归折半划分到单独的元素。在两两排序合并
public class MergeSort {
//递归排序操作将数组折半划分,从最小的数组{大小为两个元素}开始进行归并
public static void mergeSort(int[] arr, int low, int high) {
//只有当数组内元素为两个或两个以上才进行处理,只有一个元素不处理
if (low == high) {
return;
}
int middle = (high + low) / 2;
//处理对数组左半边
mergeSort(arr, low, middle);
//处理数组右半边
mergeSort(arr, middle + 1, high);
//处理整个数组
merge(arr, low, middle, high);
}
//归并操作,将一个有序的数组例如{1,3,5,7,2,4,6,8}分为{1,3,5,7}与{2,4,6,8}归并排序
// low,high,middle分别代表起始结束和中间元素的下标
public static void merge(int[] arr, int low, int middle, int high) {
//用于存储归并后的临时数组
int[] temp = new int[high - low + 1];
//将传入的数组分为两部分,记录第一个数组遍历的起始下标
int i = low;
//记录第二个数组遍历的起始下标
int j = middle + 1;
//记录在临时数组中存放的位置下标
int index = 0;
//遍历两个小数组,将最小的数字放入临时数组中
while (i <= middle && j <= high) {
//第一个数组的数据更小
if (arr[i] <= arr[j]) {
temp[index] = arr[i];
i++;
index++;
} else {
temp[index] = arr[j];
j++;
index++;
}
}
//(当其中一个数组都放完了,处理剩余的数据)
while (i <= middle) {
temp[index] = arr[i];
i++;
index++;
}
while (j <= high) {
temp[index] = arr[j];
j++;
index++;
}
//将新生成的临时数组替换掉待排序的数组
for (int k = 0; k < temp.length; k++) {
arr[low + k] = temp[k];
}
}
}
测试代码:
public static void main(String[] args) {
int[] arr = {1, 5, 7, 9, 2, 4, 6, 8};
mergeSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}