[关闭]
@XQF 2018-03-07T23:01:58.000000Z 字数 721 阅读 1035

归并排序思想应用之----求数组中的逆序对

数据结构与算法


求数组中的逆序对的问题我在大一的时候就遇到过,没想到三年了。还是不会。。。。问题摆在那里,你不主动去解决,那个问题永远在那,今天不会,你不去看,明天还是不会,后天还是不会,,,,。

  1. public class Solution{
  2. public static int counter=0;
  3. public static void group(int []nums,int left,int right){
  4. if(left>right){
  5. return ;
  6. }
  7. int mid=(left+right)/2;
  8. group(nums,left,mid);
  9. group(nums,mid+1,right);
  10. merge(nums,left,mid,right);
  11. }
  12. public static void merge(int []nums,int left,int mid,int right){
  13. int []a=new int[nums.length];
  14. int i=left;
  15. int j=mid+1;
  16. for(int k=left;k<=right;k++){
  17. a[k]=nums[k];
  18. }
  19. for(int k=left;k<=right;k++){
  20. if(i>mid){
  21. a[k]=nums[j++];
  22. }else if(j>right){
  23. a[k]=nums[i++];
  24. }else if(a[i]>a[j]){
  25. a[k]=nums[j++];
  26. // 因为如果a[i]此时比右数组的当前元素a[j]大,
  27. // 那么左数组中a[i]后面的元素就都比a[j]大
  28. // 【因为数组此时是有序数组】 用实际数字来看好像确实是这样的
  29. counter+=mid-i+1;
  30. }else {
  31. a[k]=nums[i++];
  32. }
  33. }
  34. }
  35. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注