面试题五十一:数组中的逆序对

 

在数组中如果前面的数字大于后面的,那么就是逆序对

方法一:使用插入排序,即可统计交换次数就是逆序对的值
方法二:归并排序,需要牺牲空间使得时间复杂度提高一点

public static int InversePairs(int[] data)
         {
             if(data == null || data.length < 0)
                 return 0;
             int[] copy = new int[data.length];
             for(int i = 0; i < data.length; ++i)
                 copy[i] = data[i];
             return  InversePairsCore(data, copy, 0, data.length - 1);   
         }

    public static int InversePairsCore(int[] data, int[] copy, int start, int end)
         {
             if(start == end)
             {
                 copy[start] = data[start];
                 return 0;
             }
             int length = (end - start) / 2;
             int left = InversePairsCore(copy, data, start, start + length);
             int right = InversePairsCore(copy, data, start + length + 1, end);
             // i初始化为前半段最后一个数字的下标
             int i = start + length;
             // j初始化为后半段最后一个数字的下标
             int j = end;
             int indexCopy = end;
             int count = 0;
             while(i >= start && j >= start + length + 1)
             {
                 if(data[i] > data[j])
                 {
                     copy[indexCopy--] = data[i--];
                     count += j - start - length;
                 }
                 else
                 {
                     copy[indexCopy--] = data[j--];
                 }
             }
             for(; i >= start; --i)
                 copy[indexCopy--] = data[i];
             for(; j >= start + length + 1; --j)
                 copy[indexCopy--] = data[j];
             return left + right + count;
         }
         

猜你喜欢

转载自www.cnblogs.com/niliuxiaocheng/p/12593295.html
今日推荐