P4—-1:51:03这里讲的有点绕

求数组的逆序对

本质就是求一个数其右边有多少个数比它小。
3,2是逆序对
1,2不是逆序对

代码

逆序对的个数

  1. public static int reverPairNumber(int[] arr) {
  2. if (arr == null || arr.length < 2) {
  3. return 0;
  4. }
  5. return process(arr, 0, arr.length - 1);
  6. }
  7. // arr[L..R]既要排好序,也要求逆序对数量返回
  8. // 所有merge时,产生的逆序对数量,累加,返回
  9. // 左 排序 merge并产生逆序对数量
  10. // 右 排序 merge并产生逆序对数量
  11. public static int process(int[] arr, int l, int r) {
  12. if (l == r) {
  13. return 0;
  14. }
  15. // l < r
  16. int mid = l + ((r - l) >> 1);
  17. return process(arr, l, mid) + process(arr, mid + 1, r) + merge(arr, l, mid, r);
  18. }
  19. public static int merge(int[] arr, int L, int m, int r) {
  20. int[] help = new int[r - L + 1];
  21. int i = help.length - 1;
  22. int p1 = m;
  23. int p2 = r;
  24. int res = 0;
  25. while (p1 >= L && p2 > m) {
  26. res += arr[p1] > arr[p2] ? (p2 - m) : 0;
  27. help[i--] = arr[p1] > arr[p2] ? arr[p1--] : arr[p2--];
  28. }
  29. while (p1 >= L) {
  30. help[i--] = arr[p1--];
  31. }
  32. while (p2 > m) {
  33. help[i--] = arr[p2--];
  34. }
  35. for (i = 0; i < help.length; i++) {
  36. arr[L + i] = help[i];
  37. }
  38. return res;
  39. }