归并排序

归并排序的计算复杂度要比冒泡,选择,插入要快的多,假设有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();
       }
   }

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值