归并排序

来源:互联网 发布:借乎扫描不了身份证 编辑:程序博客网 时间:2024/06/05 19:31

对于一个int数组,请编写一个归并排序算法,对数组元素排序。

给定一个int数组A及数组的大小n,请返回排序后的数组。

# 测试样例:[1,2,3,5,2,3],6[1,2,2,3,3,5]

我的提交

# -*- coding:utf-8 -*-class MergeSort:    def mergeSort(self, A, n):        # write code here        if n <= 1:            return A        num = int(n / 2)        left = self.mergeSort(A[:num],num)        right = self.mergeSort(A[num:], n - num)        result = []        i = 0        j = 0        while i < len(left) and j < len(right):            if left[i] < right[j]:                result.append(left[i])                i = i + 1            else:                result.append(right[j])                j = j + 1        result += left[i:]        result += right[j:]        return result

参考答案

package pattern;public class MergeSort {    public static void mergeSort(int[] arr) {        if (arr == null || arr.length < 2) {            return;        }        process(arr, 0, arr.length - 1);    }    public static void process(int[] arr, int left, int right) {        if (left == right) {            return;        }        int mid = (left + right) / 2;        process(arr, left, mid);        process(arr, mid + 1, right);        merge(arr, left, mid, right);    }    public static void merge(int[] arr, int left, int mid, int right) {        int[] help = new int[right - left + 1];        int l = left;        int r = mid + 1;        int index = 0;        while (l <= mid && r <= right) {            if (arr[l] <= arr[r]) {                help[index++] = arr[l++];            } else {                help[index++] = arr[r++];            }        }        while (l <= mid) {            help[index++] = arr[l++];        }        while (r <= right) {            help[index++] = arr[r++];        }        for (int i = 0; i < help.length; i++) {            arr[left + i] = help[i];        }    }    public static int[] generateArray(int len, int range) {        if (len < 1) {            return null;        }        int[] arr = new int[len];        for (int i = 0; i < len; i++) {            arr[i] = (int) (Math.random() * range);        }        return arr;    }    public static void printArray(int[] arr) {        if (arr == null || arr.length == 0) {            return;        }        for (int i = 0; i < arr.length; i++) {            System.out.print(arr[i] + " ");        }        System.out.println();    }    public static boolean isSorted(int[] arr) {        if (arr == null || arr.length < 2) {            return true;        }        for (int i = 1; i < arr.length; i++) {            if (arr[i - 1] > arr[i]) {                return false;            }        }        return true;    }    public static void main(String[] args) {        int len = 10;        int range = 10;        int testTimes = 50000;        for (int i = 0; i < testTimes; i++) {            int[] arr = generateArray(len, range);            mergeSort(arr);            if (!isSorted(arr)) {                System.out.println("Wrong Case:");                printArray(arr);                break;            }        }        int len2 = 13;        int range2 = 10;        int testTimes2 = 50000;        for (int i = 0; i < testTimes2; i++) {            int[] arr = generateArray(len2, range2);            mergeSort(arr);            if (!isSorted(arr)) {                System.out.println("Wrong Case:");                printArray(arr);                break;            }        }    }}
原创粉丝点击