归并排序
递归算法,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]); } } }