1 /** 2 *归并排序思路:分治法思想 O(nlogn) 3 * 把数组一分为二,二分为四 4 * 四和为二,二和为一 5 * 6 */ 7 8 /** 9 * 归并排序主方法 10 *@params 待排序的数组 11 *@params 初始位置 12 *@params 最终位置 13 */ 14 15 public class MergeSort 16 { 17 public static void mergeSort(int[] resouceArr, int begin , int end ) 18 { 19 if ( begin < end ) 20 { 21 int middle = ( begin + end ) / 2 ; 22 mergeSort( resouceArr , begin , middle ); 23 mergeSort( resouceArr , middle + 1 , end ); 24 _merge( resouceArr , begin , middle , end ); 25 } 26 } 27 /** 28 *合并两个已经排好序数组的方法 29 *由mergeSort()调用,定义为private,命名以下划线开头 30 */ 31 private static void _merge(int[] arr , int begin , int middle , int end ) 32 { 33 //获得左数组大小,右数组大小 34 int leftArrLength = middle - begin + 1 ; 35 int rightArrLength = end - middle ; 36 //申请空间 37 int[] leftArr = new int[leftArrLength + 1]; 38 int[] rightArr = new int[rightArrLength + 1]; 39 //初始化数组的值(把原数组的值一个一个复制quickArr到新数组中) 40 for( int i = 0 ; i < leftArrLength ; i++) 41 { 42 leftArr[i] = arr[begin + i] ; 43 } 44 for( int j = 0 ; j < rightArrLength ; j++) 45 { 46 rightArr[j] = arr[middle + j + 1] ; 47 } 48 //哨兵,放在最后 49 leftArr[leftArrLength] = 65536 ; 50 rightArr[rightArrLength] = 65536 ; 51 52 int i = 0 ; 53 int j = 0 ; 54 for(int k = begin ; k <= end ; k++ ) 55 { 56 if( leftArr[i] <= rightArr[j] ) 57 { 58 arr[k] = leftArr[i] ; 59 i = i + 1 ; 60 } 61 else 62 { 63 arr[k] = rightArr[j]; 64 j = j + 1 ; 65 } 66 } 67 } 68 }
时间: 2024-11-06 02:40:07