吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1346|回复: 3
收起左侧

[Java 转载] 排序之归并排序(不同区间)

[复制链接]
QingYi. 发表于 2021-1-22 20:45
本帖最后由 QingYi. 于 2021-1-22 21:03 编辑

代码1:
sort的区间是[l r]
merge的区间是  [l mid] [mid+1,r]

[Java] 纯文本查看 复制代码
public class mergeSort {    static int[] t;

    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 2, 4, 8, 6, 7};
        int n = arr.length;
        t = new int[n];
        sort(arr, 0, n - 1);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }

    private static void sort(int[] arr, int l, int r) {
        if (l >= r) {
            return;
        }
        int mid = l + r >> 1;
        sort(arr, l, mid);
        sort(arr, mid + 1, r);
        merge(arr, l, mid, r);
    }

    private static void merge(int[] arr, int l, int mid, int r) {
        System.arraycopy(arr, l, t, l, r - l + 1);
        int i = l, j = mid + 1;
        for (int k = l; k <= r; k++) {
            if (i > mid) {
                arr[k] = t[j++];
            } else if (j > r) {
                arr[k] = t[i++];
            } else if (t[i] <= t[j]) {
                arr[k] = t[i++];
            } else {
                arr[k] = t[j++];
            }
        }
    }
}

代码2:
sort的区间是[l r)merge的区间是  [l mid)  [mid+1,r)

[Asm] 纯文本查看 复制代码
public class mergeSort {
    static int[] t;

    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 2, 4, 8, 6, 7};
        int n = arr.length;
        t = new int[n];
        sort(arr, 0, n );
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }

    private static void sort(int[] arr, int l, int r) {
        if (r-l<=1) {
            return;
        }
        int mid = l + r >> 1;
        sort(arr, l, mid);
        sort(arr, mid , r);
        merge(arr, l, mid, r);
    }

    private static void merge(int[] arr, int l, int mid, int r) {
        System.arraycopy(arr, l, t, l, r - l );
        int i = l, j = mid ;
        for (int k = l; k < r; k++) {
            if (i >= mid) {
                arr[k] = t[j++];
            } else if (j >= r) {
                arr[k] = t[i++];
            } else if (t[i] <= t[j]) {
                arr[k] = t[i++];
            } else {
                arr[k] = t[j++];
            }
        }
    }
}

在新标签打开所有链接复制所有链接URL复制所有链接URL(反向)复制所有链接标题 + URL复制所有链接标题 + URL (MD)复制所有链接标题 + URL (BBS)复制所有链接标题 + URL (筛选)复制所有链接标题 + URL (设置复制格式)在新标签页打开所有图片链接在一个标签页显示所有图片链接
复选框 - 选中
复选框 - 取消
复选框 - 反选
单选框 - 选中
单选框 - 取消
特殊单选框 - 选中
在新标签打开所有链接复制所有链接URL复制所有链接URL(反向)复制所有链接标题 + URL复制所有链接标题 + URL (MD)复制所有链接标题 + URL (BBS)复制所有链接标题 + URL (筛选)复制所有链接标题 + URL (设置复制格式)在新标签页打开所有图片链接在一个标签页显示所有图片链接
复选框 - 选中
复选框 - 取消
复选框 - 反选
单选框 - 选中
单选框 - 取消
特殊单选框 - 选中

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| QingYi. 发表于 2021-1-22 20:53
马云爱逛京东 发表于 2021-1-22 20:48
方便解释一下
int mid = l + r >> 1;
的作用吗?右移的位操作看不太懂

等于 (l+r)/2的意思  右移运算符
马云爱逛京东 发表于 2021-1-22 20:48
方便解释一下
int mid = l + r >> 1;
的作用吗?右移的位操作看不太懂
 楼主| QingYi. 发表于 2021-1-22 20:58
马云爱逛京东 发表于 2021-1-22 20:48
方便解释一下
int mid = l + r >> 1;
的作用吗?右移的位操作看不太懂

我添加了一个不同区间的写法,您可以继续参考学习一下。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 20:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表