原理
分支算法处理数组,每次分成两组,并将每一组看做有序数组,之后合并到一个数组中
思路
1.从数组中间值分为左右两部分,进行递归直到每组中只有一个元素时,这时我们可以将其看做已经排好的有序数组(其实就是一个数没有顺序罢了)
2.新创建一个数组,遍历两个有序数组,将其按顺序放入新数组中
3.将新的数组返回,返回上一层递归
代码
public class MergeSort {
/**
* 归并排序: 将数组按递归一直分成两组,之后将所有数组看做顺序数组进行合并
* @param arr 需要排序的原数组
* @param left 分组的当前数组的起始索引
* @param right 分组的当前数组的结束索引
* @param temp 辅助数组
* @return
*/
public static int[] margeSort(int arr[] , int left , int right , int temp[]){
if (left >= right){
return arr;
}
// mid是当前有序数组的中间值
int mid = (left+right)/2;
// 分成两组,第一组从left到mid,第二组从mid+1到right
margeSort(arr,left,mid,temp);
margeSort(arr,mid+1,right,temp);
int t = 0;
int i = left;
int j = mid+1;
System.out.println("left = " + left + " right = " + right);
System.out.println("i = " + i + " j = " + j);
// 将两个有序数组按序存放到temp中,i是第一个数组的起始索引,j是第二个数组的起始索引
while (i<=mid && j<=right){
// 按照从小到大的顺序进行排序
// 如果左边数组的数小于右边数组的值,则放入左边的值,左边下标向右移
while (i<=mid&&arr[i]<=arr[j]){
temp[t] = arr[i];
t++;
i++;
}
// 反之,则放入右边的值,右边的下标向右移
while (j<=right&&arr[i]>=arr[j]){
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其实就是两个数组合并好之后的情况,所以将temp填回原数组
int tempLeft = left;
t = 0;
while (tempLeft <= right){
arr[tempLeft] = temp[t];
tempLeft++;
t++;
}
for (int l = 0 ; l < arr.length ; l++){
System.out.print(arr[l] + " ");
}
System.out.println();
return arr;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数组长度: ");
int n = scanner.nextInt();
int arr[] = new int[n];
System.out.println("请输入数组元素: ");
for (int i = 0 ; i < n ; i++){
arr[i] = scanner.nextInt();
}
int []temp = new int[n];
arr = margeSort(arr,0,arr.length-1,temp);
for (int i = 0 ; i < arr.length ; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}