归并排序(JAVA实现)

归并排序采用的是分治(divide-and-conquer)法思想

(1)基本思想:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合;

(2)执行过程:

(3)算法思路:

算法 MERGESORT
输入:n个元素的数组A[1...n].
输出:按非降序排列的数组A[1...n]

过程:mergesort(low,high)
1. if(low<high) then
2.   mid-(low+high)/2;
3. mergesort(A,low,mid);
4. mergesort(A,mid+1,high);
5. MERGE(A,low,mid,high);
6.end if

(4)代码实现(JAVA):

public class Test{
 
   private Integer[] nums = {3,8,9,10,7,6,5,2,4,1,11,12};
 
    @Test
    public void test() {
 
       devideSortArray(0,nums.length-1);
       
 
    }
 
 
    public void devideSortArray(Integer begin,Integer end){
        if (begin<end){
            Integer mid = (Integer)(begin+end)/2;
            System.out.print("获得"+begin+"---"+mid+"---"+end+"\n");
            devideSortArray(begin,mid);  //对左边序列进行归并排序
            devideSortArray(mid+1,end);  //对右边序列进行归并排序
            caculate(begin,mid,end,nums);//合并两个有序序列
        }
    }
 
    
    public Integer[] caculate(Integer begin,Integer mid,Integer end,Integer[] showNum){
        Integer[] tempNum =new Integer[end+1]; //新建一个临时数组存放
        int k = begin;
        int left = begin;
        int right = mid+1; //左边序列与右边序列起始索引
        int cur = showNum[k];
 
        while (left <= mid && right <=end){
            if (showNum[left]>showNum[right]){
                tempNum[k] = showNum[right];
                right++;
                k++;
            }else {
                tempNum[k] = showNum[left];
                left++;
                k++;
            }
        }
        //左边有剩余 加入数组中
        while (left<=mid){
            tempNum[k] = showNum[left];
            left++;
            k++;
        }
        
        //右边有剩余 加入数组中
        while (right<=end){
            tempNum[k] = showNum[right];
            k++;
            right++;
        }
 
        int b = begin;
        int e = end;
 
        System.out.print("排列数--->>>>>>>\n");
        for (int i = 0; i < tempNum.length; i++) {
            if (tempNum[i] != null){
                System.out.print("---"+tempNum[i]);
                showNum[b] = tempNum[i];
                b++;
            }
 
        }
        System.out.print("<<<<<<<<<<\n");
        return tempNum;
    }
 
}

参考链接:

https://blog.csdn.net/javaskyhr/article/details/88527431

http://www.360doc.com/content/19/1020/21/26884319_868046433.shtml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值