排序算法-------快速排序

public class MergeSort2 {

    public static void main(String[] args) {
        int[] arr = {49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51};
        mergeSort(arr, 0, 1);
        for (int i : arr) {
            System.out.println(i);

        }
    }
    /**
     *  * <pre>
     *  * 二路归并----递归实现
     *  * 原理:将两个有序表合并和一个有序表
     *  * </pre>
     *  *
     *  * @param a
     *  * @param start
     *  * 第一个有序表的起始下标
     *  * @param middle
     *  * 第二个有序表的起始下标
     *  * @param terminated
     *  * 第二个有序表的结束小标
     *  *
     */
    private static void merge(int[] a, int start, int middle, int terminated) {
        int[] tmp = new int[terminated - start + 1];
        int i = start, j = middle, k = 0;
        while (i < middle && j <= terminated) {
            if (a[i] <= a[j]) {
                tmp[k] = a[i];
                k++;
                i++;
            } else {
                tmp[k] = a[j];
                j++;
                k++;
            }
        }
        while (i < middle) {
            tmp[k] = a[i];
            i++;
            k++;
        }
        while (j <= terminated) {
            tmp[k] = a[j];
            j++;
            k++;
        }
        System.arraycopy(tmp, 0, a, start, tmp.length);
    }

    /**
     *  *
     *  * @param a
     *  * @param s
     *  * @param len
     *  * 每次归并的有序集合的长度,传入1,实现升序
     */
    public static void mergeSort(int[] a, int s, int len) {
        int size = a.length;
        int mid = size / (len << 1);//中间值等于数组长度size除以len*2
        int c = size & ((len << 1) - 1);//逻辑与操作
        // -------归并到只剩一个有序集合的时候结束算法-------//
        if (mid == 0)
            return;
        // ------进行一趟归并排序-------//
        for (int i = 0; i < mid; i++) {
            s = i * 2 * len;
            merge(a, s, s + len, (len << 1) + s - 1);
        }
        // -------将剩下的数和倒数一个有序集合归并-------//
        if (c != 0)
            merge(a, size - c - 2 * len, size - c, size - 1);
        // -------递归执行下一趟归并排序------//
        mergeSort(a, 0, 2 * len);
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_42061676/article/details/81093257