/**
* 专门用于进行排序,里面包含各种排序方法
* @author
*
*/
public class SortClass {
归并排序
* @return
*/
public static int[] guiBing( int[] arr ) {
int[][] arry = new int[arr.length][1];
//将一维数组变成二维数组
for(int i = 0; i < arr.length; i++){
arry[i] = new int[] { arr[i] };
}
//合并有序数组到一个为止
int[][] arr3 = arry;
for(;;) {
if( arr3.length > 1 ) {
arr3 = SortClass.getHalf(arr3);
}else {
break;
}
}
return arr3[0];
}
/**
* 入参是两个有序的由小到大的数组
* @param arr1
* @param arr2
* @return 返回由小到大的有序数组
*/
public static int[] mergeArr(int[] arr1, int[] arr2) {
int[] result = new int[ arr1.length + arr2.length ];
int startArr1 = 0;
int startArr2 = 0;
int insertIndex = 0;
for( ; ;) {
if( startArr1 > arr1.length - 1 || startArr2 > arr2.length - 1 ) {
break;
}
if( arr1[startArr1] <= arr2[startArr2] ) {
result[insertIndex] = arr1[startArr1];
startArr1 += 1;
}else {
result[insertIndex] = arr2[startArr2];
startArr2 += 1;
}
insertIndex += 1;
}
if( startArr1 > arr1.length - 1 ) {
for( int k = startArr2; k < arr2.length; k++ ) {
result[insertIndex] = arr2[k];
insertIndex += 1;
}
}else {
for( int k = startArr1; k < arr1.length; k++ ) {
result[insertIndex] = arr1[k];
insertIndex += 1;
}
}
return result;
}
/**
* 压缩自身数组元素至原来的一半
* @return
*/
public static int[][] getHalf(int[][] arr) {
int[][] result;
if( arr.length % 2 == 1 ) {
result = new int[ arr.length / 2 + 1][];
}else {
result = new int[ arr.length / 2][];
}
for( int i = 0; i < result.length; i++) {
if( (i * 2 + 1) >= arr.length ) {
result[i] = mergeArr(arr[i*2],new int[] {});
}else {
result[i] = mergeArr(arr[i*2],arr[i*2 + 1]);
}
}
return result;
}
public void insertSort(int [] a){
int insertIndex = 0;
int j = 0;
for(int i = 1;i<a.length;i++) {
insertIndex = a[i];
j = i-1;
while(j>0&&a[j]>insertIndex) {
a[j+1] = a[j];
j--;
}
a[j+1] = insertIndex;
}
}
}
此算法的时间复杂度是(n*logn)
归并排序先将整个数组进行分组,每次分组后组的个数都少一半
所以分组的次数就是log2n然后进行两组合并排序这个时间复杂度是
n