今天学习了归并排序和逆序对,逆序对经过多次测试才成功,所以传上来以作纪念,新手创作,不喜勿喷
归并排序:
public static void MergeSort1(int [] arrs){
if(arrs==null||arrs.length<2){
return;
}
MergeSort1(arrs,0,arrs.length-1);
}
public static void MergeSort1(int [] arrs,int l,int r){
if(l==r){
return;
}
int mid = l +((r-l)>>1);//等价于 L+((R-L)/2)保证不会溢出
MergeSort1(arrs,l,mid);
MergeSort1(arrs,mid+1,r);
Merge(arrs,l,mid,r);
}
public static void Merge(int [] arrs,int l,int m,int r){
int[] temp = new int [r-l+1];
int i = 0;
int p1 = l;
int p2 = m+1;
//将数组已经排好的左右两边进行排序
while(p1<=m&&p2<=r){
temp[i++] = arrs[p1] < arrs[p2] ? arrs[p1++] : arrs[p2++];
}
//以下两个while语句,只会执行一个,将较长的另一边剩下的数组全部拷贝进去
while(p1<=m){
temp[i++] = arrs[p1++];
}
while(p2<=r){
temp[i++] = arrs[p2++];
}
//将排好序的数组拷贝给原数组
for(i=0;i<temp.length;i++){
arrs[l+i] = temp[i];
}
}
逆序对的:
public static void mergeSoft(int[] arrs){
if(arrs==null||arrs.length<2){
return;
}
mergeSoft(arrs,0,arrs.length-1);
}
public static void mergeSoft(int[] arrs,int l,int r){
if(l==r){
return;
}
int mid = l+((r-l)>>1);
mergeSoft(arrs,l,mid);
mergeSoft(arrs,mid+1,r);
merge(arrs,l,mid,r);
}
public static void merge(int[] arrs,int l,int m,int r){
int[] temp = new int[r-l+1];
int i = 0;
int p1 = l;
int p2 = m+1;
int p3 = 0;
while(p1<=m&&p2<=r){
//如果,p1位置的数大于p2位置,那么证明p1-m的数都大于p2,所以这些数全和它构成逆序对,需要全部打印
if(arrs[p1] > arrs[p2]){
p3 = p1;
while(p3<=m){
System.out.println(arrs[p3++]+":"+arrs[p2]);
}
}
temp[i++] = arrs[p1] > arrs[p2] ? arrs[p2++] : arrs[p1++];
}
while(p1<=m){
temp[i++] = arrs[p1++];
}
while(p2<=r){
temp[i++] = arrs[p2++];
}
for(i=0;i<temp.length;i++){
arrs[l+i] = temp[i];
}
}