java归并排序的实现
一,归并排序的简介
- 归并排序是一个典型的基于分治的递归算法。它不断地将原数组分成大小相等的两个子数组(数组元素为奇数个时,可能相差1),最终当划分的子数组大小为1时,将划分的有序子数再合并成一个有序的数组。归并排序的思想就是先递归分解数组,再合并数组。
二,归并排序示意图
举例:int[] arr = {7,4,1,3,6,8,2,5};
三,代码实现
import java.util.Arrays;
public class huashanzhizai {
public static void main(String[] args) {
int[] arr = {7,4,1,3,6,8,2,5};
int[] temp = new int[arr.length];
MergeSort(arr,0,arr.length-1,temp);
System.out.println(Arrays.toString(arr));
}
//元素分解
public static void MergeSort(int[] arr,int left,int right,int[] temp){
if (left<right){
//中间索引
int mid = (left + right)/2;
//递归左边进行分解
MergeSort(arr,left,mid,temp);
//递归右边进行分解
MergeSort(arr,mid+1,right,temp);
//到合并
merge(arr,left,mid,right,temp);
}
}
//元素合并
public static void merge(int[] arr,int left,int mid,int right,int[] temp){
//左边有序序列的初始索引
int i = left;
//右边有序序列的初始索引
int j = mid+1;
//指向temp的当前索引
int t = 0;
//先把左右两边的有序元素有序的拷贝到temp数组中
while (i <= mid && j <= right){
if (arr[i] <= arr[j]){
temp[t] = arr[i];
t++;
i++;
}else {
temp[t] = arr[j];
t++;
j++;
}
}
//把一边剩余的元素拷贝到temp数组中
while (i <= mid){
temp[t] = arr[i];
t++;
i++;
}
while (j <= right){
temp[t] = arr[j];
t++;
j++;
}
//将temp数组中元素拷贝到arr数组中
t = 0;
int templeft = left;
while (templeft <= right){
arr[templeft] = temp[t];
templeft++;
t++;
}
}
}
执行结果
[1, 2, 3, 4, 5, 6, 7, 8]
为啥先写合并的代码呢?因为不好思考,但是会给后面写分解的代码提供思路。苦吃到前面总是对的。
四,原理分析
- 请见上代码。
- 时间复杂度 : 平均情况 or 最坏情况下都是O(NlogN)。
- 稳定性 :算法稳定