[关闭]
@XQF 2018-03-07T22:54:08.000000Z 字数 921 阅读 721

排序----归并排序

数据结构与算法


先是进行分组,真正的排序是在后面的归并部分。归并的时候还要额外空间。
这里要把两部分全部比较,不用把中间剩出来。
因此:

  1. group(nums, left, mid-1);//这是错的
  2. group(nums, mid + 1, right);
  1. public class Solution {
  2. public static void group(int[] nums, int left, int right) {
  3. if (left >= right) {
  4. return;
  5. }
  6. int mid = (left + right) / 2;
  7. group(nums, left, mid);
  8. group(nums, mid + 1, right);
  9. mergeSort(nums, left, mid, right);
  10. }
  11. public static void mergeSort(int[] nums, int left, int mid, int right) {
  12. int[] a = new int[nums.length];
  13. int i = left;
  14. int j = mid + 1;
  15. for (int k = left; k <= right; k++) {
  16. a[k] = nums[k];
  17. }
  18. for (int k = left; k <= right; k++) {
  19. if (i > mid) {// i本身是小于medium,但是现在已经比medium大了,说明右半部分已经消耗完了,插入左半部分
  20. nums[k] = a[j++];
  21. } else if (j > right) {// 同理,j本身应该是小于right的,但是现在已经比right大了,说明左半部分已经消耗完了,插入右半部分
  22. nums[k] = a[i++];
  23. } else if (a[i] > a[j]) {// 如果右半部分的当前值比左半部分的当前值大,则插入左半部分当前值
  24. nums[k] = a[j++];
  25. } else {
  26. nums[k] = a[i++];// 如果右半部分比左半部分小或者等,则插入右半部分
  27. }
  28. }
  29. }
  30. public static void main(String[] args) {
  31. int[] nums = {1, 2, 55, 6, 3, 2, 4, 5, 6, 8, 9, 0};
  32. group(nums, 0, nums.length - 1);
  33. System.out.println(Arrays.toString(nums));
  34. }
  35. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注