本文共 1908 字,大约阅读时间需要 6 分钟。
package Sort;public class CombineSort { /** * 二路归并排序的核心是让两个有序数组合并为数组 * 二路归并排序的两个有序数组是相邻的 * 二路归并排序必须要先创建一个数组放置排完序的数组,然后再复制回去 */ public static void TwoRoadCombine(int[] array, int start, int middle, int end){ int[] tmpArray = new int[end - start + 1]; int leftPointer = start, rightPointer = middle; int index = 0;//新数组的下标 while(leftPointer < middle && rightPointer <= end){ if(array[leftPointer] <= array[rightPointer]){ tmpArray[index++] = array[leftPointer++]; }else{ tmpArray[index++] = array[rightPointer++]; } } while(leftPointer < middle){ tmpArray[index++] = array[leftPointer++]; } while(rightPointer <= end){ tmpArray[index++] = array[rightPointer++]; } System.arraycopy(tmpArray,0,array,start,tmpArray.length); } /** * 归并排序是先排2个元素,再排四个元素,再排8个 * 如果子数组的个数是单数个,最后一个不参与排序 * 而且要注意最后一组子数组元素个数较小的情况。 * @param */ public static void oneTimeSort(int[] array, int length){//length是有序子数组的长度 int count = array.length/length;//count是有序数组的数量 int i = 0; for(i = 0; i < count/2; i++){//count/2是有序数组的成组数 TwoRoadCombine(array, 2*i*length,(2*i+1)*length,(2*i+2)*length-1); } if(count%2 == 1 && array.length%length != 0){//如果说count是个奇数,而且这个数组长度不是有序数组程度的整数倍 TwoRoadCombine(array,2*i*length,(2*i+1)*length,array.length - 1); } } /** * 接下来就是归并排序算法 * @param */ public static void combineSort(int[] array){ int length = 1; for(length = 1; length < array.length; length = length*2){ oneTimeSort(array,length); } } public static void main(String[] args){ int[] array = {2,1,3,8,323,32,542,23,4524}; combineSort(array); ArrayPrint.arrayPrint(array); }}
转载地址:http://vizji.baihongyu.com/