归并排序

分析:

将一个数组拆成两个数组分别进行排序,然后将两个排序好的数组进行合并。

JAVA代码实现:

public class Main {
   
    public static void main(String[] args) {
        int[] arr = new int[100];
        for(int i=0;i<100;i++) {
            arr[i] = (int) (Math.random() * 100);
        }
        sort(arr);
        for(int i=0;i<100;i++){
            System.out.println(arr[i]);
        }
    }
    
    public static void sort(int[] arr) {
        sort(arr, 0, arr.length-1);
    }
    
    //对数组中的[start, end]进行排序
    private static void sort(int[] arr, int begin, int end) {
        if(begin >= end) { //边界
            return;
        }
        int half = (begin + end) /2;
        //先排序左边
        sort(arr, begin, half);
        //再排序右边
        sort(arr, half+1, end);
        merge(arr, begin, half, end);
    }
    
    private static void merge(int[] arr, int begin, int half ,int end) {
        int[] cache = new int[end - begin + 1];
        int k = 0;
        int l = begin;
        int r = half+1;
        while(l <= half && r <= end) {
            if(arr[l] <= arr[r]) {
                cache[k++] = arr[l++];
            }
            else{
                cache[k++] = arr[r++];
            }
        }
        while(l<=half){
            cache[k++] = arr[l++];
        }
        while(r<=end){
            cache[k++] = arr[r++];
        }
        for(int i=begin;i<=end;i++){
            arr[i] = cache[i-begin];
        }
    }
}

你可能感兴趣的:(归并排序)