java方式实现归并排序
一、基本思想
归并排序是建立在归并操作上的一种排序算法,该算法是采用分治法的一个典型应用。具体操作如下:所谓的分治就是分而治之,以一分为二的原则,先把序列平均分解成二个左右子序列,然后递归左右二个子序列进行分解操作,直到得到的子序列为一个元素时,然后两两合并子序列并排序,然后递归以上合并操作,直到合并完整个序列。归并排序的平均时间复杂度为O(nlog2n),归并排序需要开辟一个数组空间,所有归并排序空间复杂度为0(n)。归并排序是稳定的排序。
二、图解
三、代码实现
ublic class JavaSort { public static void main(String[] args) { int a [] =new int []{6,5,3,1,8,7,2,4}; System.out.println("排序前的数组:"+Arrays.toString(a)); mergeSort(a, 0, a.length-1); System.out.println("排序后的数组:"+Arrays.toString(a)); } /** * * @param ary 未排序的序列 * @param left 序列起始索引 * @param right 序列末尾索引 */ public static void mergeSort(int[] ary, int left, int right) { if(null == ary) { return; } if(left < right) { //找中间位置进行划分 int mid = (left+right)/2; //对左子序列进行递归分解 mergeSort(ary, left, mid); //对右子序列进行递归分解 mergeSort(ary, mid+1, right); // 进行递归并归排序 merge(ary, left, mid, right); } } /** * 进行归并 * @param ary 未排序的序列 * @param left 序列起始索引 * @param mid 序列中间索引 * @param right 序列末尾索引 */ private static void merge(int[] ary, int left, int mid, int right) { int[] tempArr = new int[ary.length]; int leftStart = left; int rightStart = mid+1; int tempIndex = left; while(leftStart <= mid && rightStart <= right) { if(ary[leftStart] < ary[rightStart]) { tempArr[tempIndex++] = ary[leftStart++]; } else { tempArr[tempIndex++] = ary[rightStart++]; } } while(leftStart <= mid) { tempArr[tempIndex++] = ary[leftStart++]; } while(rightStart <= right) { tempArr[tempIndex++] = ary[rightStart++]; } while(left <= right) { ary[left] = tempArr[left++]; } }
}
代码运行: