归并排序(递归排序and外排排序)

时间:2023-03-09 22:24:01
归并排序(递归排序and外排排序)

分析:

归并排序(递归排序and外排排序)

/**
* 归并排序  (先将数组利用归并排序排成 有序的左边数组和右边数组,再比较左边数组和右边数组的数值大小进行排序)
*
*/
public class MergeSort {
public static void mergeSort(int[] arr){
if(arr.length<2 || arr==null){
return;
}
mergeSort(arr,0,arr.length-1);
}
public static void mergeSort(int[] arr,int L,int R){
if(L==R){
return;
}
//中点位置
int mid=L+((R-L)>>1);
mergeSort(arr,L,mid);
mergeSort(arr,mid+1,R);
merge(arr,L,mid,R);
}
public static void merge(int[] arr,int L,int mid,int R){
//临时数组存储
int[] help=new int[R-L+1];
//记录临时数组位置
int i=0;
//记录左边数组位置
int p1=L;
//记录右边数组位置
int p2=mid+1;
while (p1<=mid && p2<=R){
help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
}
//()将再将左边数组or右边数组中,排好序但是数值大,没有比较的数值放入临时数组中
while (p1<=mid){
help[i++]=arr[p1++];
}
while (p2<=R){
help[i++]=arr[p2++];
}
//将排好序的临时数组的数值放入原来数组中
for (int j = 0; j < help.length; j++) {
arr[L+j]=help[j];
}
}
//测试
public static void main(String[] args) {
//随机生成10个 1~40的数进行测试
Random ran=new Random();
int[] te=new int[10];
for (int i = 0; i < 10; i++) {
te[i]=ran.nextInt(40) + 1;
}
mergeSort(te);
for (int i = 0; i < te.length; i++) {
System.out.print(te[i]+" ");
}
} }