1.什么是归并排序
归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序思路,假设我们现在有左右两个数组,他们也已经排好序了。
我们再重新建立一个长度为左数组的长度加右数组的长度的数组,比较着让他们进入新的数组并排好序
这样两个数组就排好了,如果一边的数组并不是依次排好的呢?那我们就需要再将他分成两个部分,再进行插入,也就是一个递归运算
2.代码部分
1.将两数组合并起来的方法
static void merge(int[] arr, int left, int right){
//创建一个数组接取有顺序的数字
int[] temp = new int[right - left];
//取数组的中间一位
int mid = left + (right - left) / 2 - 1;
int i = left;
int j = mid + 1;
int k = 0;
//进行比较,然后存入新数组
while (i <= mid && j < right){
if (arr[i] >= arr[j]){
temp[k ++] = arr[j ++];
} else {
temp[k ++] = arr[i ++];
}
}
//将未存完的数组依次放入新数组中
while (i <= mid){
temp[k ++] = arr[i ++];
}
//将未存完的数组依次放入新数组中
while (j < right){
temp[k ++] = arr[j ++];
}
//将新数组的值赋值给原来的数组
for (int n = 0; n < temp.length ; n ++){
// left 是因为先递归了左边, 要占位
arr[left +n] = temp[n];
}
}
2.递归调用1中的方法
public static void sort(int[] arr,int left,int right){
//递归判断
if (left == right) return;
//取中间值
int mid = left + (right - left) / 2;
//左排序
sort(arr, left, mid);
//右排序
sort(arr,mid + 1, right);
//调用方法
merge(arr, left, right);
}
3.完整代码
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 2, 4, 8, 11, 12, 13};
sort(arr, 0, arr.length);
for (int i : arr){
System.out.println(i);
}
}
public static void sort(int[] arr,int left,int right){
if (left == right) return;
//取中间值
int mid = left + (right - left) / 2;
//左排序
sort(arr, left, mid);
//右排序
sort(arr,mid + 1, right);
merge(arr, left, right);
}
static void merge(int[] arr, int left, int right){
int[] temp = new int[right - left];
int mid = left + (right - left) / 2 - 1;
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid && j < right){
if (arr[i] >= arr[j]){
temp[k ++] = arr[j ++];
} else {
temp[k ++] = arr[i ++];
}
}
while (i <= mid){
temp[k ++] = arr[i ++];
}
while (j < right){
temp[k ++] = arr[j ++];
}
for (int n = 0; n < temp.length ; n ++){
// left 是因为先递归了左边, 要占位
arr[left +n] = temp[n];
}
}