归并排序
递归算法,O(nlogn)最坏时间
从中间把数组分为两部分,分别对左右进行排序,再将两部分排好序的数组合并起来。
public class MergeSort {
public static void mergeSort(int[] arr) {
//临时数组
int[ ] tmpArray = new int[arr.length];
mergeSort( arr, tmpArray, 0, arr.length - 1 );
}
private static void mergeSort( int[] a, int[] tmpArray, int left, int right ){
if(left >= right) return;
//计算中心分界
int center = ( left + right ) / 2;
//归并排序分界前
mergeSort( a, tmpArray, left, center );
//归并排序分界后
mergeSort( a, tmpArray, center + 1, right );
//合并
merge( a, tmpArray, left, center + 1, right );
}
//合并算法
private static void merge( int[ ] a, int[ ] tmpArray, int leftPos, int rightPos, int rightEnd ){
int leftEnd = rightPos - 1;
int tmpPos = leftPos;
int numElements = rightEnd - leftPos + 1;
while( leftPos <= leftEnd && rightPos <= rightEnd )
if( a[leftPos] <= a[rightPos])
tmpArray[tmpPos++] = a[leftPos++];
else
tmpArray[ tmpPos++ ] = a[rightPos++];
//如果左数组还没有结束,将剩余部分拷贝
while( leftPos <= leftEnd )
tmpArray[ tmpPos++ ] = a[ leftPos++ ];
//如果右数组还没结束,将剩余部分拷贝进来
while( rightPos <= rightEnd )
tmpArray[ tmpPos++ ] = a[ rightPos++ ];
//将临时数组值拷贝回原数组
for( int i = 0; i < numElements; i++, rightEnd-- )
a[ rightEnd ] = tmpArray[ rightEnd ];
}
public static void main(String[] args) {
int[] c = { 4, 9, 23, 1, 45, 27, 5, 2 };
mergeSort(c);
for (int i = 0; i < c.length; i++) {
System.out.println(c[i]);
}
}
}