33,027
社区成员




public class Sorter{
private HashMap<Item,Integer> originalList=new HashMap<Item,Integer>();
//在构造方法中把myList中的数据的序号用HashMap记录下来.
//
Sorter(List<Item> myList){
for(int i=0;i<myList.size();i++){
originalList.put(myList.get(i),i);
}
}
//用自己定义的comparator对另一个myList排序,java自己做好sort方法应该采用的是归并排序。
//交换元素最少的应该是快排吧。
//
public void sort(List<Item> myList){
Collections.sort(myList,new comparator());
}
//自己定义的比较器,用两个数据的序号来决定他们的次序。,
//
public class comparator implements Comparator<Item>{
public int compare(Item i1,Item i2){
return originalList.get(i1)-originalList.get(i2);
}
public boolean equals(Object o){
return false;
}
}
}
#include <stdio.h>
#include <stdlib.h>
/**只用修改这里*******************************/
#define ASIZE 10
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b[10]={1,5,10,3,4,6,8,7,2,9};
/*******************************只用修改这里**/
struct node{
int a,b;
};
int fun(int *a,int *b,int len){
int i,j,z,c=0,t=0,r=0,tmp;
char *ruler;
struct node* note;
int *chose;
int *save;
printf("A\t");
for(i=0;i<len;i++) printf("%d, ",a[i]);printf("\n");
/* 保存B的值 */
save=(int*)malloc(sizeof(int)*len);
printf("B\t");
for(i=0;i<len;i++){
printf("%d, ",b[i]);save[i]=b[i];
}printf("\n");
/* 创建标尺 */
ruler=(char*)malloc(sizeof(char)*len);
for(i=0;i<len;i++){
if(a[i]==b[i]) ruler[i]=1;
else{
ruler[i]=0;c++;
}
}
/* 创建记录本 */
note=(struct node*)malloc(sizeof(struct node)*c);
chose=(int*)malloc(sizeof(int)*c);
for(i=0;i<len;i++){
if(ruler[i]==1) continue;
r=0;
for(j=i+1;j<len;j++){
if(ruler[j]==1) continue;
if(a[i]==b[j]) chose[r++]=j;
}
/* B不能变成A */
if(r==0){
free(ruler);free(note);free(chose);free(save);return -1;
}
/* 优选 */
for(z=0;z<r;z++){
if(a[chose[z]]==b[i]){
note[t].a=i;note[t].b=chose[z];t++;
ruler[i]=1;ruler[chose[z]]=1;
tmp=b[i];b[i]=b[chose[z]];b[chose[z]]=tmp;c=c-2;
}
}
if(ruler[i]==1) continue;
/* 随选 */
note[t].a=i;note[t].b=chose[0];t++;
ruler[i]=1;
tmp=b[i];b[i]=b[chose[0]];b[chose[0]]=tmp;c=c-1;
}
for(i=0;i<t;i++){
printf("change %d,%d\n",note[i].a,note[i].b);
printf("B\t");
tmp=save[note[i].a];save[note[i].a]=save[note[i].b];save[note[i].b]=tmp;
for(j=0;j<len;j++) printf("%d, ",save[j]);printf("\n");
}
free(ruler);free(note);free(chose);free(save);return 0;
}
int main(){
if(fun(a,b,ASIZE)==-1) printf("can not change B to A!\n");
return 0;
}