package com.dugstudio.SwordToOfferBook.Singleton.Interview;
import java.util.Arrays;
/**
* @Author JH
* @CreateDate 18-6-10
* @Description 數組中的逆序對
*/
public class InversePairs {
/**
* 數組中的逆序對 利用歸併排序
* 浪費了copy的空間 以空間換時間
*/
private static int [] copy;
public int InversePairs(int [] array) {
if(array==null||array.length<=0)return 0;
copy=new int[array.length];
for (int i=0;i<array.length;i++){
copy[i]=array[i];
}
return InversePairs(array,copy,0,array.length-1);
}
private int InversePairs(int[] array, int[] copy, int start, int high) {
if (start==high){
//劃分到只剩一個元素
copy[start]=array[start];
return 0;
}
int mid=(high+start)>>1;
int left=InversePairs(array,copy,start,mid);
int right=InversePairs(array,copy,mid+1,high);
int i=mid,count=0;
int k=high,j=high;
//合併左右分路 從左右的最後一個元素開始比較 將大者放在copy的start-end的最後一個位置
while(i>=start&&j>mid){
if (array[i]>array[j]){
//左邊元素大於右邊元素,則j-mid個元素都可以和左邊的元素組成逆序對
count+=j-mid;
copy[k--]=array[i--];
}else{
copy[k--]=array[j--];
}
}
while(i>=start){
copy[k--]=array[i--];
}
while (j>mid){
copy[k--]=array[j--];
}
//將copy數組排序後的對應位置複製給array
for (int m=start;m<=high;m++){
array[m]=copy[m];
}
return count+left+right;
}
/**
* 歸併排序
* @param array
* @param start
* @param end
*/
public void inverse(int [] array,int start,int end){
if (start==end)return ;
int mid=(end+start)/2;
inverse(array,start,mid);
inverse(array,mid+1,end);
merge(array,start,end);
}
public void merge(int [] array,int start,int end){
for(int i=start;i<=end;i++){
int min=array[i];int index=i;int j=i+1;
for (;j<=end;j++){
if (min>array[j]){
min=array[j];
index=j;
}
}
if (min!=Integer.MAX_VALUE){
array[index]=array[i];
array[i]=min;
}
}
}
public static void main(String[] args) {
int [] a={7,5,6,4};
int [] b={1,2,3,4,5,6,7,0};
InversePairs i=new InversePairs();
//i.inverse(b,0,b.length-1);
// i.inverse(a,0,a.length-1);
System.out.println(i.InversePairs(a));
for (int m:copy){
System.out.print(m);
}
}
}
數組中的逆序對
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.