归并排序算法

Merge Sort

public class MergeSort {

    private MergeSort(){}

    public static <E extends Comparable<E>> void sort(E[] arr){
        sort(arr, 0, arr.length - 1);   // 传入 0, 最后个位置
    }

    private static <E extends Comparable<E>> void sort(E[] arr, int l, int r){

        if (l >= r) return; // 终止条件是 l=r 表示只有一个元素

        int mid = l + (r - l) / 2;  // 获取索引的中间值
        sort(arr, l, mid);
        sort(arr, mid + 1, r);
        merge(arr, l, mid, r);
    }

    // 合并两个有序的区间 arr[l, mid] 和 arr[mid + 1, r]
    private static <E extends Comparable<E>> void merge(E[] arr, int l, int mid, int r){

        // 这里有一个额外的拷贝动作,因此需要更多的内存空间,相对于其他排序算法
        E[] temp = Arrays.copyOfRange(arr, l, r + 1);

        int i = l, j = mid + 1;

        // 每轮循环为 arr[k] 赋值
        for(int k = l; k <= r; k ++){

            if(i > mid){    // 表示左侧没值了。
                arr[k] = temp[j - l]; j ++;
            }
            else if(j > r){ // 表示 右侧没有值了。
                arr[k] = temp[i - l]; i ++; // i++前进
            }
            else if(temp[i - l].compareTo(temp[j - l]) <= 0){   // arr数组值已经变了,需要从temp去比较
                arr[k] = temp[i - l]; i ++;
            }
            else{
                arr[k] = temp[j - l]; j ++;
            }
        }
    }
}

Leave a Comment

Your email address will not be published. Required fields are marked *

PHP 8.1.1 - 20.433 ms, 0 Q