版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/L_0000/article/details/82430249
归并排序
public static void main(String[] args) {
//产生随机数作为测试数据,[0,100)的10个随机数
int[] arr = generateData(0,100,10);
//打印排序前的数组
for(int i:arr){
System.out.print(i + " ");
}
mergeSort(arr);
//打印排序后的数组
System.out.println();
for(int i:arr){
System.out.print(i + " ");
}
}
/**
* 1、分部分排序;2、把各部分合并
* @param arr
*/
public static void mergeSort(int[] arr) {
int l = 0;
int r = arr.length-1;
Msort(arr,l,r);
}
排序
//部分数组排序
public static void Msort(int[] arr,int l,int r) {
if(l>=r)
return ;
int mid = (l+r)/2;
Msort(arr,l,mid);
Msort(arr,mid+1,r);
merge(arr,l,mid,r);
}
最重要的合并:
public static void merge(int[] a, int low, int mid, int high) {
int[] temp = new int[high-low+1];
int i= low;
int j = mid+1;
int k=0;
// 把较小的数先移到新数组中
while(i<=mid && j<=high){
if(a[i]<a[j]){
temp[k++] = a[i++];
}else{
temp[k++] = a[j++];
}
}
// 把左边剩余的数移入数组
while(i<=mid){
temp[k++] = a[i++];
}
// 把右边边剩余的数移入数组
while(j<=high){
temp[k++] = a[j++];
}
// 把新数组中的数覆盖nums数组
for(int x=0;x<temp.length;x++){
a[x+low] = temp[x];
}
}
产生随机数在上一篇文章《经典排序——快排》里,
链接在这:经典排序——快排与优化
归并排序的优化
- 归并排序,依次递归的排序过程,比插入总的来说快,或自顶向下
- 判断索引是否越界
- 优化1、if(arr[mid]>arr[mid+1]),才需要归并
- 优化2、当排序数很少时,有序的概率更大,可以改用插入排序,效率更高
//部分数组排序
public static void Msort(int[] arr,int l,int r) {
if(l>=r)
return ;
int mid = (l+r)/2;
Msort(arr,l,mid);
Msort(arr,mid+1,r);
//优化1、if(arr[mid]>arr[mid+1]),才需要归并
if(arr[mid]>arr[mid+1]) {
merge(arr,l,mid,r);
}
}