题目说明
给定你一个长度为 n 的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在 1∼10^9 范围内),表示整个数列。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
输出样例:
笔者理解
此题是一道排序算法问题,在AcWing题库中被定义为简单题。
解法
当笔者阅读完此题后,发现此题有多种解法,根据题目所以使用归并排序,归并排序采用分治的思想,将原数组转化为多个小数组进行求解,让我们来看看具体如何实现的吧。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| import java.util.*;
class Main{ public static void merge(int[] nums, int left, int mid, int right) { int nl = mid - left + 1; int nr = right - mid; int[] l = new int [nl]; int[] r = new int [nr]; int i, j, k; for (i = 0; i < nl; i++) { l[i] = nums[left + i]; } for (i = 0; i < nr; i++) { r[i] = nums[mid + 1 + i]; } i = 0; j = 0; k = left; while (i < nl && j < nr) { if (l[i] <= r[j]) { nums[k] = l[i]; i++; } else { nums[k] = r[j]; j++; } k++; } while (i < nl) { nums[k] = l[i]; i++; k++; } while (j < nr) { nums[k] = r[j]; j++; k++; } } public static void mergeSort(int[] nums, int left, int right) { if (left < right) { int mid = left + (right - left) / 2; mergeSort(nums, left, mid); mergeSort(nums, mid + 1, right); merge(nums, left, mid, right); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] nums = new int [n]; for (int i = 0; i < n; i++) { nums[i] = sc.nextInt(); } mergeSort(nums, 0, n - 1); StringBuilder sb = new StringBuilder(); for (int i = 0; i < n - 1; i++) { sb.append(nums[i] + " "); } sb.append(nums[n - 1]); System.out.print(sb.toString()); } }
|
总结
本题是今天的一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。