归并排序(Java实现)

归并排序,(⊙o⊙)…
看上去挺简单的,但这个写起来我觉得是最复杂的。
具体是什么可以百度,建议看我代码之前先看看视频。
好了,下面贴代码:

// 名称:归并排序
// 学校:河北大学
// 作者:来智慧<3552743712@qq.com>
// 时间:2016年10月14日
public class O1014{
    public static void main(String[] args){
        int[] array = new int[]{61, 20, 65, 4, 22, 97, 6, 36, 79, 8};
        // 声明一个整形数组,长度和array相同,存放临时数据
        int[] temp = new int[array.length];
        printArray(array);
        iteration(array, temp, 0, array.length - 1);
        printArray(array);
    }

    // 打印数组
    public static void printArray(int[] array){
        for(int i = 0; i < array.length; i++){
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }

    // 一次归并
    public static void merge(int[] array, int[] temp, int left, int middle, int right){
        // 数组从中间分开,分为左右两个数组,左部分最后位置为中间位置-1
        int leftEnd = middle - 1;
        // 右边数组元素起始位置为middle
        int rightBegin = middle;
        // 定义临时数组的首元素下标值为left
        int indexOfTemp = left;
        // 定义number变量表示数组内元素的个数
        int number = right - left + 1;

        // 当左指针未遍历到左边数组的末尾且右指针未到达右边数组的末尾时,进入循环
        while(left <= leftEnd && rightBegin <= right){
            // 比较左边数组第一个元素的数值和右边数组第一个元素的数值大小
            // 把两者较小者,放入临时数组temp中
            // 同时临时数组的指针右移,左边数组的指针也右移
            if(array[left] < array[rightBegin]){
                temp[indexOfTemp++] = array[left++];
            }
            else{
                temp[indexOfTemp++] = array[rightBegin++];
            }
        }
        // 当左指针仍未到达末尾,右指针已经遍历到末尾时
        // 将左边数组中剩下的元素移动到临时数组中
        while(left <= leftEnd){
            temp[indexOfTemp++] = array[left++];
        }
        // 当右指针仍未到达末尾,左指针已经遍历到左边数组末尾时
        // 将右边数组中的元素送入临时数组中
        while(rightBegin <= right){
            temp[indexOfTemp++] = array[rightBegin++];
        }
        // 由高位到低位依次将临时数组里的值移到array数组中
        for(int i = 0; i < number; i++, right--)
        {
            array[right] = temp[right];
        }
    }

    // 递归调用
    public static void iteration(int[] array, int[] temp, int left, int right)
    {
        if(left < right){
            // 将数组的中间位置保存到middle变量中
            int middle = (left + right) / 2;
            // 将数组划分为两部分,对左右分别进行递归调用
            iteration(array, temp, left, middle);
            iteration(array, temp, middle + 1, right);
            // 递归之后,调用归并函数,将左右数组合并在一起
            merge(array, temp, left, middle + 1, right);
        }
    }
}

可能我脑子太笨,这个程序琢磨了一下午才写出来,希望多与大家切磋交流~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值