data structure and algorithms

归并排序

2018-05-15  本文已影响0人  spraysss

归并排序使用分而治之的算法
Divide:将n个元素的序列分位两个n/2的子序列
Conquer:使用递归排序两个子序列
Combine:合并有序的子序列

import java.util.Arrays;

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

    }
    public static void mergeSort(int[] array, int p, int r) {
        if (p < r) {
            int q = (p + r) / 2;
            mergeSort(array, p, q);
            mergeSort(array, q + 1, r);
            merge(array, p, q, r);//合并
        }
    }

    /**
     * p <= q < r
     * array[p..q]和array[q+1..r]为有序序列
     * 将两个有序序列合并为array[p..r]
     */
    public static void merge(int[] array, int p, int q, int r) {
        int[] leftArray = Arrays.copyOfRange(array, p, q + 1);//array[p-q]
        int[] rightArray = Arrays.copyOfRange(array, q + 1, r + 1);//array[q+1,r]
        int llen = q - p + 1;
        int rlen = r - q;
        int i = 0;
        int j = 0;
        int k = p;
        for (; k < r + 1; k++) {
            if (i >= llen || j >= rlen) {
                break;
            }
            if (leftArray[i] <= rightArray[j]) {
                array[k] = leftArray[i++];
            } else {
                array[k] = rightArray[j++];
            }
        }
        while (i < llen ) {
            array[k++] = leftArray[i++];
        }
        while (j < rlen ) {
            array[k++] = rightArray[j++];
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读