同一値のある値列の並べ替え




public static void main(String[] args) {
double[] d = {4,-1,2,3,6,2,6,2,2};
int[][] a = bublSortSameVals(d);
}
public static int[][] bublSortSameVals(double[] p){
double[] copyP = DeepCopyDouble1(p);
int[] ret = new int[p.length];
for(int i=0;i<ret.length;i++){
ret[i]=i;
}
boolean flag=true;
boolean sameflag=false;
for(int i=copyP.length-1;i>=0;i--){
for(int j=1;j<=i;j++){
if(copyP[j-1]==copyP[j]){
sameflag=true;
}
if(copyP[j-1]>copyP[j]){
double tmp = copyP[j-1];
int tmpint = ret[j-1];
copyP[j-1]=copyP[j];
ret[j-1]=ret[j];
copyP[j]=tmp;
ret[j]=tmpint;
if(flag){
flag=false;
}else{
flag=true;
}
}
}
}



int[] retorder = new int[ret.length];
for(int i=0;i<ret.length;i++){
retorder[ret[i]] = i;
}


int[] numsame = new int[ret.length];
int[] sameVsameO = new int[ret.length];

for(int i=0;i<retorder.length;i++){
if(i>0){
if(p[ret[i]]==p[ret[i-1]]){
numsame[ret[i]]=numsame[ret[i-1]];
sameVsameO[ret[i]]=sameVsameO[ret[i-1]];
}else{

numsame[ret[i]]=1;
sameVsameO[ret[i]]=retorder[ret[i]];
for(int j=i+1;j<ret.length;j++){
if(p[ret[j]]==p[ret[j-1]]){

numsame[ret[i]]++;
}else{
break;
}
}
}
}else{

numsame[ret[i]]=1;
sameVsameO[ret[i]]=retorder[ret[i]];
for(int j=i+1;j<ret.length;j++){
if(p[ret[j]]==p[ret[j-1]]){

numsame[ret[i]]++;
}else{
break;
}
}

}
}




int[] revorder = new int[ret.length];
for(int i=0;i<ret.length;i++){
revorder[i] = ret.length-(sameVsameO[i]+numsame[i]);
}

System.out.println("Input ");
for(int i=0;i<p.length;i++){
System.out.println("i=" + i + " "+ p[i]);
}
System.out.println("Ascending-ordered list ");
for(int i=0;i<ret.length;i++){
System.out.println("i=" + i + " " + ret[i] + " " + p[ret[i]]);
}
System.out.println("(1) ascending order. Different number for multiple values ");
for(int i=0;i<retorder.length;i++){
System.out.println("i=" + i + " "+ retorder[i]);
}
System.out.println("(2) ascending order. Same number for multiple values ");
for(int i=0;i<sameVsameO.length;i++){
System.out.println("i=" + i + " "+ sameVsameO[i]);
}
System.out.println("(3) descending order. Same number for multiple values");
for(int i=0;i<revorder.length;i++){
System.out.println("i=" + i + " "+ revorder[i]);
}
System.out.println("(4) number of records of the same value with self.");
for(int i=0;i<numsame.length;i++){
System.out.println("i=" + i + " "+ numsame[i]);
}
int[][] ret2 = new int[0][0];//Returns are to be determined
return ret2;
}

ソートしてから、大小比較


public static int[][] CompareGradVector(double[] g1,double[] g2){
//int[] ret = {0,0,0};
MiscUtil.bublSortDouble(g1);
MiscUtil.bublSortDouble(g2);

int[][] counter = new int[g1.length][3];//[0] is less-counter, [1] is equal-counter
int check=0;
for(int i=0;i<g1.length;i++){
if(i==0){
counter[i][0]=0;
counter[i][1]=0;

}else{
if(g1[i]==g1[i-1]){
counter[i][1]=counter[i-1][1];
counter[i][0]=counter[i-1][0];
continue;
}else{

counter[i][0]=counter[i-1][0]+counter[i-1][1];
counter[i][1]=0;
}
}

for(int j=check;j<g2.length;j++){

if(g1[i]>g2[j]){
counter[i][0]++;
if(j==g2.length-1){
check=j+1;
}
}else if(g1[i]==g2[j]){
counter[i][1]++;
if(j==g2.length-1){
check=j+1;
}
}else{
check=j;
break;
}

}

}
for(int i=0;i<g1.length;i++){
counter[i][2]=g2.length-counter[i][0]-counter[i][1];
}
return counter;
}