思路: 将存有较多数据的数组,拆分成两个数组,分别排序后,将有序的两个数组合并。合并前递归拆分的过程,直至只有一个元素后,逐级合并。
实现:
package com.test; /** * 归并排序 * @author xurongsheng * @date 2017年4月14日 上午11:22:25 * */ public class MergeSort { private long[] target;//待排序数据 public MergeSort(){ } public MergeSort(int maxLength){ target = new long[maxLength]; } public void setTargetValue(int index,long value){ target[index] = value; } public long getTargetValue(int index){ return target[index]; } public void display(){ System.out.print("A="); for (int i = 0; i < target.length; i++) { System.out.print(target[i]+" "); } System.out.println(" "); } /** * 归并排序 * 时间复杂度: O(nlogN) * @author xurongsheng * @date 2017年4月14日 下午3:32:10 */ public void mergeSort(){ long[] workSpace = new long[target.length]; recMergeSort(workSpace,0,target.length-1); } /** * 归并 * @author xurongsheng * @date 2017年4月14日 上午11:33:29 * @param workSpace * @param lowerBound * @param upperBound */ private void recMergeSort(long[] workSpace,int lowerBound,int upperBound){ if(lowerBound == upperBound){ //只有一个元素,无需排序 return; }else{ int mid = (lowerBound+upperBound)/2; //中间项 recMergeSort(workSpace,lowerBound,mid); //排序左侧项 recMergeSort(workSpace,mid+1,upperBound); //排序右侧项 merge(workSpace,lowerBound,mid+1,upperBound); } } /** * 合并两个有序数组 * @author xurongsheng * @date 2017年4月14日 下午2:12:16 * @param workSpace * @param lowPtr * @param highPtr * @param upperBound */ private void merge(long[] workSpace,int lowPtr,int highPtr,int upperBound){ int j = 0; // int lowerBound = lowPtr; int mid = highPtr - 1; int n = upperBound - lowerBound + 1; while(lowPtr <= mid && highPtr <= upperBound){ if(target[lowPtr] < target[highPtr]){ workSpace[j++] = target[lowPtr++]; }else{ workSpace[j++] = target[highPtr++]; } } while(lowPtr <= mid){ workSpace[j++] = target[lowPtr++]; } while(highPtr <= upperBound){ workSpace[j++] = target[highPtr++]; } for(j = 0; j 效率: 归并排序的时间复杂度为 O(n*logN) 最好、最坏、平均情况下都是O(n*logN) logN为以2为底N的对数 由于计算过程中需要一个长度为n的临时空间,故 空间复杂度为O(N)