如有时间。再在原地,把重复的元素干掉,i指向无重复的,j向后遍历
package jjj;
import java.util.Arrays;
import java.util.Scanner;
public class hhhhhhhhhhh {
public static void main(String[] args){
int a[] = {-1,1,2,1,1,1,1,3,2,1,1,1,0,1,1,0};
shu(a,a.length);
System.out.println(Arrays.toString(a));
}
static int max(int a,int b){
if(a>b) return a;
return b;
}
static int min(int a,int b){
if(a>b) return b;
return a;
}
static void shu(int a[],int N)
{
//转入第一个元素
for(int j=4;j<N;j=j+3){
int a1,a2,a3;
int i =j;
while(a[i]<a[i-3]&&i>=4){
a1=a[i-3]; a2=a[i-2]; a3=a[i-1];
a[i-3]=a[i]; a[i-2]=a[i+1]; a[i-1]=a[i+2];
a[i]=a1; a[i+1]=a2;a[i+2]=a3;
i=i-3;
}
}
for(int jJ=4;jJ<N;jJ=jJ+3){
int i = jJ; //费了很多时间,你是想用上面的那个插入方法,while里面会用很多的判断
while(i>=4){
//三重防护
if(a[i]>a[i-3]) {i=i-3; continue;}//不用交换了
if((a[i]==a[i-3]) && max(a[i+1],a[i+2])>max(a[i-2],a[i-1]) ) {i=i-3;continue;}
if((a[i]==a[i-3]) && max(a[i+1],a[i+2])==max(a[i-2],a[i-1]) && min(a[i+1],a[i+2])>=min(a[i-2],a[i-1]) ) {i=i-3;continue;}
//交换区
int a1,a2,a3;
a1=a[i-3]; a2=a[i-2]; a3=a[i-1];
a[i-3]=a[i]; a[i-2]=a[i+1]; a[i-1]=a[i+2];
a[i]=a1; a[i+1]=a2;a[i+2]=a3;
i=i-3;
}
}
}
}