归并排序——Java

为了方便起见,程序将分与治写在同一个函数中,并且部分代码不合理,比较消耗资源,但是胜在程序容易理解。

/**
     * 归并排序是一种分治算法,思想在于分而治之,一下是测试50000个随机数时,排序效率:
     * (其他两个排序代码请见以前的文章) 
     * 冒泡排序用时:5370 
     * 归并排序用时:19 
     * 选择排序用时:1352
     */
    public static int[] mergeSort(int arr[], int left, int right) {
        // 递归结束条件,因为是将合并与分治写在一个函数,而返回值类型为int[]
        // 所以递归返回的为int[](ps:这样比较消耗内存资源与CPU资源)
        if (left >= right) {
            int t[] = new int[1];
            t[0] = arr[left];
            return t;
        }
        int mid = left + (right - left) / 2;
        // 划分子问题(一般递归)
        int le[] = mergeSort(arr, left, mid);
        int ri[] = mergeSort(arr, mid + 1, right);
        // 合并操作
        int mer[] = new int[le.length + ri.length];//比较浪费空间
        //但是笔者内存多,哈哈哈
        int i, j, count = 0;
        //将左右数组按照大小放入mer中
        for (i = 0, j = 0; i < ri.length && j < le.length;) {
            if (ri[i] < le[j]) {
                mer[count] = ri[i];
                i++;
                count++;
            } else {
                mer[count] = le[j];
                j++;
                count++;
            }
        }
        // 当左右数组大小不等时,需要将长的剩余部分复制到mer中
        if (i >= ri.length && j < le.length) {
            for (; j < le.length; j++) {
                mer[count] = le[j];
                count++;
            }
        } else {
            for (; i < ri.length; i++) {
                mer[count] = ri[i];
                count++;
            }
        }
        return mer;
    }

猜你喜欢

转载自blog.csdn.net/zwzsdy/article/details/80057089
今日推荐