思路分析
代码如下:
package com.shujujiegou;
import sun.awt.im.SimpleInputMethodWindow;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
public class Hello {
public static void main(String[] args) {
int arr[]=new int[]{8,4,5,7,1,3,6,2};
int temp[]=new int[arr.length]; //归并排序需要一个格外的空间
System.out.println("排序前的数组是:"+Arrays.toString(arr));
System.out.println("***************");
mergeSort(arr,0,arr.length-1,temp);
System.out.println("***************");
System.out.println("排序后的数组是:"+Arrays.toString(arr));
}
//分+合方法
public static void mergeSort(int []arr,int zuo,int you,int[] temp){
if(zuo<you){
int mid=(zuo+you)/2; //中间索引
//向左递归进行分解
mergeSort(arr,zuo,mid,temp);
//向右递归进行分解
mergeSort(arr,mid+1,you,temp);
//到合并
merge(arr,zuo,mid,you,temp);
}
}
//合并方法
public static void merge(int []arr,int zuo,int mid,int you,int []temp){
int i=zuo; //初始化i,左边有序序列的初始索引
int j=mid+1; //初始化j,右边有序序列的初始索引
int t=0; //指向temp数组的当前索引
//1.先把左右两边的数据按照规则填充到temp数组,直到左右两边的有序序列有一边处理完毕为止
while (i<=mid && j<=you){
//如果左边的有序序列的当前元素小于等于右边有序序列的当前元素,就将左边的当前元素填充到temp数组,然后t要后移,i也要后移
if(arr[i]<=arr[j]){
temp[t]=arr[i];
t++;
i++;
}else {
temp[t]=arr[j];
t++;
j++;
}
}
//2.把有剩余数据的一边的数据依次全部填充到temp去
while (i<=mid){//说明左边的有序序列还有剩余的元素,就需要全部填充过去
temp[t]=arr[i];
t++;
i++;
}
while (j<=you){//说明左边的有序序列还有剩余的元素,就需要全部填充过去
temp[t]=arr[j];
t++;
j++;
}
//3.将temp数组的元素拷贝到arr,注意,并不是每次都拷贝所有
t=0;
int tempLeft=zuo;
//第一次合并tempLeft=0,right=1 // tempLeft=2,right=3,最后一次tempLeft=0,right=17
while (tempLeft<=you){
arr[tempLeft]=temp[t];
t++;
tempLeft++;
}
}
}
代码运行效果如下:
在处理大数据量的排序上,感觉归并排序和快速排序的处理速度差不多,都挺快的,相差不大。