归并排序的计算复杂度要比冒泡,选择,插入要快的多,假设有N个数据,归并排序是需要把数组不断的进行二分,一直分到不能继续查分为止,所以需要拆分的次数为log2(N),即拆分成log2(N)组,又因为在每一组排序需要花费的次数是N,所以总共的运算复杂度为(o)Nlog2(N)
public class MergeSort { private long[] theArray; private int nElem; public MergeSort(int max){ theArray = new long[max]; nElem = 0; } public void insert(long value){ theArray[nElem] = value; nElem++; } public void display(){ for (int j = 0; j <nElem ; j++) { System.out.print(theArray[j]+' '); } System.out.println(""); } public void mergeSort(){ long[] workSpace = new long[nElem]; recMergeSort(workSpace,0,nElem-1); } 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); } } 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 (theArray[lowPtr]<theArray[highPtr]) workSpace[j++] = theArray[lowPtr++]; else workSpace[j++] = theArray[highPtr++]; while (lowPtr<=mid) workSpace[j++] = theArray[lowPtr++]; while (highPtr<=upperBound) workSpace[j++] = theArray[highPtr++]; for (j = 0; j < n; j++) { theArray[lowerBound+j] = workSpace[j]; } } } class MergeSortApp{ public static void main(String[] args){ int maxSize = 100; MergeSort arr; arr = new MergeSort(maxSize); arr.insert(64); arr.insert(21); arr.insert(33); arr.insert(70); arr.insert(12); arr.insert(85); arr.insert(44); arr.insert(3); arr.insert(99); arr.insert(0); arr.insert(108); arr.insert(36); arr.display(); arr.mergeSort(); arr.display(); } }