归并排序算法(适合大量数据)


归并排序算法和快速排序算法时间复杂度都为o(nlogn) ,且需要额外申请一个内存空间,用到的思想都是分治。
下边是我的代码可以拿去直接用。




public class MergeSort {
    public static void main(String[] args) {

        int arr[] = new int[]{1, 9, 2, 4, 88, 21, 15, 33, 16, 22, 51, 53, 99};//15
        new MergeSort().merge_sort(arr);
        System.out.println("");

    }

    public void merge_sort(int[] arr) {
        quick_sort_c(arr, 0, arr.length - 1);
    }

    private void quick_sort_c(int[] arr, int first, int end) {
        if (first >= end) return;
        int m = (first + end) / 2;
        quick_sort_c(arr, first, m);
        quick_sort_c(arr, m + 1, end);
        merge(arr, first, end, m);
    }

    private void merge(int arr[], final int s, final int e, final int m) {
        //把数组arr由 s-e 划分成两个区域  s-m   m+1-e

        int temp[] = new int[(e - s)+1];//申请一个和arr原数组一样的新数组
        int i = s, j = m + 1;
        int k;
        for (k = 0; i <= m && j <= e; k++) {
            if (arr[i] <= arr[j]) {
                temp[k] = arr[i++];
            } else {
                temp[k] = arr[j++];
            }
        }
        //判断一下哪一个区域有剩余,并将剩余的部分依次放入temp
        int sn = 0, se = -1;
        if (i <= m) {
            sn = i;
            se = m;
        } else if (j <= e) {
            sn = j;
            se = e;
        }
        for (; sn <= se; sn++) {
            temp[k++] = arr[sn];
        }
        //把temp合并好的有序数组依次放到原数组种
        for (int t = 0; t< temp.length; t++) {
            arr[s + t] = temp[t];
        }
    }

你可能感兴趣的:(算法)