Java 归并排序

思路

数组排序主要分为两个部分:划分数组和归并排序。

划分数组:

  1. 将待排序的无序数组分为左右两个部分,如果无序数组的起始元素下标为first,最后一个元素的下标为last,那么左右两部分之间的临界点下标mid=(first+last)/2,这两部分分别是arr[first … mid]和arr[mid+1 … last];

  2. 将上面得到的两部分数组继续按照步骤(1)进行划分,直到划分的数组长度为1。

归并排序:

  1. 申请空间,空间大小为两个已经排序数组之和,该空间用来存放合并后的数组;

  2. 设定两个指针,最初位置分别为两个已经排序数组的起始位置;

  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

  4. 重复步骤(3)直到某一指针超出数组尾,将另一数组剩下的所有元素直接复制到合并数组尾。

代码

    public void mergeSort(int[] arr, int first, int last) {
        int mid;
        if (first < last) {
            mid = (first + last) / 2;
            mergeSort(arr, first, mid);
            mergeSort(arr, mid + 1, last);
            merge(arr, first, mid, last);
        }
    }

    private void merge(int[] arr, int first, int mid, int last) {
        int i, j;
        int[] temp = new int[arr.length];
        int left_first = first;
        int right_first = mid + 1;

        for (i = 0; left_first <= mid && right_first <= last; i++) {
            if (arr[left_first] <= arr[right_first]) {
                temp[i] = arr[left_first++];
            } else {
                temp[i] = arr[right_first++];
            }
        }
        if (left_first <= mid) {
            for (j = left_first; j <= mid; j++) {
                temp[i++] = arr[j];
            }
        }
        if (right_first <= last) {
            for (j = right_first; j <= last; j++) {
                temp[i++] = arr[j];
            }
        }
        for (j = 0; j < last - first + 1; j++) {
            arr[first + j] = temp[j];
        }
    }

作者:流星残阳

出处:https://www.cnblogs.com/liu-im/p/17676401.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   星流残阳  阅读(115)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示