归并排序

package com.cisco.www.test;

import java.util.Arrays;

/**
* 归并排序
* 算法思想:分治
* 时间复杂度:O(nlogn)
* 空间复杂度O(N)
*
*/
public class MergeSort {
public static void mergeSort(int[] arr){
if(arr==null||arr.length<2){
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)/2;
mergeSort(arr,l,mid);
mergeSort(arr,mid+1,r);
merge(arr,l,mid,r);
}

private static void merge(int[] arr, int l, int m, int r) {
int[] help = new int[r-l+1];
int i = 0 ;
int p1 = l;
int p2 = m+1;
while (p1<=m&&p2<=r){
help[i++] = arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
}
while (p1<=m){
help[i++]=arr[p1++];
}
while (p2<=r){
help[i++] = arr[p2++];
}
for(i = 0 ; i<help.length;i++){
arr[l+i] = help[i];
}
}

//test
public static void main(String[] args){
int testTime = 1000000;
int size = 100;
int value =100;
boolean succeed = true;
for(int i = 0 ; i <testTime ; i++){
int[] arr1 = generateRandomArray(size,value);
int[] arr2 = copyArray(arr1);
mergeSort(arr1);
comparator(arr2);
if(!isEqual(arr1,arr2)){
succeed=false;
break;
}
}
System.out.println(succeed?"Nice":"Fucking fucked!");
int[] arr= generateRandomArray(size,value);
printArray(arr);
mergeSort(arr);
printArray(arr);
}

public static boolean isEqual(int[] arr1, int[] arr2) {
if((arr1==null&&arr2!=null)||(arr1!=null&&arr2==null)){
return false;
}
if(arr1==null&&arr2==null){
return true;
}
if(arr1.length!=arr2.length){
return false;
}
for(int i = 0 ; i<arr1.length;i++){
if(arr1[i]!=arr2[i]){
return false;
}
}
return true;
}

public static void comparator(int[] arr) {
Arrays.sort(arr);
}

public static int[] copyArray(int[] arr) {
if(arr==null){
return null;
}
int[] res = new int[arr.length];
for(int i = 0 ; i<arr.length;i++){
res[i] = arr[i];
}
return res;
}

//test
public static int[] generateRandomArray(int size, int value) {
//生成长度为0-100之间的随机数组
int[] arr = new int[(int)(Math.random()*(size+1))];
for(int i =0 ; i<arr.length;i++){
arr[i] = (int)(Math.random()*(value+1)) - (int)(Math.random()*value);
}
return arr;
}
//
public static void printArray(int[] arr){
if(arr==null){
return;
}
for(int i =0 ; i <arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}

}
原文地址:https://www.cnblogs.com/bigdata-stone/p/11100588.html