归并排序
来源:互联网 发布:借乎扫描不了身份证 编辑:程序博客网 时间: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; } } }}
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 计算机设备名称英语词汇(2)
- Codewarrior 中的 .prm 文件
- java学习——java基础(七)之 IO
- Memcache笔记
- 网络丢包的四大原因和修复方法
- 归并排序
- Inverse of sum
- 用epoll演示tcp代理
- 未来八种人将被社会淘汰
- OPENCV运动追踪研究和PYTHON及JAVA实现
- python异常处理
- 拦截导弹,动规贪心是朋友你知道吗!
- 2016编程题扑克牌游戏
- arm swi 软中断测试