Loading

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];
        }
    }
posted @ 2023-09-04 11:06  星流残阳  阅读(115)  评论(0编辑  收藏  举报