排序算法之归并排序

归并排序指的是先用递归分散,再合并的排序方法,直接上代码

public class GuiBingPaiXu {
    public static void main(String[] args) {
        int sort[] = {9, 5, 6, 8, 4, 2, 1, 3, 7};
//        int sort[] = {9, 5, 6, 8, 0, 3, 7, 1};
        mergeSort(sort, 0, sort.length - 1);
        System.out.println(Arrays.toString(sort));
    }

    public static void mergeSort(int data[], int left, int right) {
        if (left < right) {
            // 取中间分割的下标
            int mid = (left + right) / 2;
            // 切分左半边数据
            mergeSort(data, left, mid); // 有弹栈的操作
            // 切分右半边数据
            mergeSort(data, mid + 1, right);
            // 合并数据
            mergeData(data, left, mid, right);
        }
    }

    public static void mergeData(int data[], int left, int mid, int right) {
        // 定义一个临时数组,用来装数据
        int temp[] = new int[data.length];
        // 当前数组起始值
        int loc = left;
        // 左半边起始值
        int point1 = left;
        // 右半边其实值
        int point2 = mid + 1;
        // 判断下标是否小于等于临界值
        while (point1 <= mid && point2 <= right) {
            if (data[point1] < data[point2]) {
                temp[loc] = data[point1];
                loc++;
                point1++;
            } else {
                temp[loc] = data[point2];
                loc++;
                point2++;
            }
        }
        // 将左半边还没有变换位置的放到temp数组
        while (point1 <= mid) {
            temp[loc++] = data[point1++];
        }
        // 将右半边还没有变换位置的放到temp数组
        while (point2 <= right) {
            temp[loc++] = data[point2++];
        }
        // 将原本的数组进行排序
        for (int i = left; i <= right; i++) {
            data[i] = temp[i];
        }
    }
}

归并排序的切割左边部分、右边部分两个方法不会去同时执行,按照顺序先切割左边数据,再切割右边数据。合并数据时也是先合并左边数据,再合并右边数据。注意方法执行时放在栈中,有弹栈的操作,不会重复的进行if (left < right)的判断,通常是切割左边方法执行完了,执行右边切割方法,然后合并的方法

附一张切割和合并的图:

排序算法之归并排序_第1张图片

 

你可能感兴趣的:(java,数据结构,java,排序算法)