java算法之归并排序

来源:互联网 发布:网络消费知识 编辑:程序博客网 时间:2024/05/23 07:23

基本思想
待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
代码

public class MergeSort {    public static void mergeSort(int[] arr) {        sort(arr, 0, arr.length - 1);    }    public static int[] sort(int[] arr, int low, int high) {        int mid = (low + high) / 2;        if (low < high) {            // 左边            sort(arr, low, mid);            // 右边            sort(arr, mid + 1, high);            // 左右归并            merge(arr, low, mid, high);        }        return arr;    }    public static void merge(int[] arr, int low, int mid, int high) {        int[] temp = new int[high - low + 1];        int i = low;// 左指针        int j = mid + 1;// 右指针        int k = 0;        // 把较小的数先移到新数组中        while (i <= mid && j <= high) {            if (arr[i] < arr[j]) {                temp[k++] = arr[i++];            } else {                temp[k++] = arr[j++];            }        }        // 把左边剩余的数移入数组        while (i <= mid) {            temp[k++] = arr[i++];        }        // 把右边边剩余的数移入数组        while (j <= high) {            temp[k++] = arr[j++];        }        // 把新数组中的数覆盖arr数组        for (int k2 = 0; k2 < temp.length; k2++) {            arr[k2 + low] = temp[k2];        }    }    public static void main(String[] args) {        int[] a = new int[] { 49, 38, 65, 97, 76, 13, 27, 50 };        mergeSort(a);        for (int i : a)            System.out.print(i + " ");    }}

时间复杂度
O(nlgn)