public static void select(int [] arr){
for (int i=0;i<arr.length;i++) {
for (int j=i+1;j<arr.length;j++){
if(arr[i]<arr[j]){
swap(i,j,arr);
}
}
}
}
public static void mao(int [] arr){
for (int y=0;y<arr.length-1;y++){
for (int x=0;x<arr.length-1;x++){
if (arr[x]>arr[x+1]){
swap(x,x+1,arr);
}
}
}
}
//通过异或运算对数进行置换
public static void swap(int x,int y,int []arr){
arr[x]=arr[x]^arr[y];
arr[y]=arr[x]^arr[y];
arr[x]=arr[y]^arr[x];
}
异或运算(同0得1,异为0)
性质:
- 可以当成无进位的加法
- 0^n=n n^n=0
- 满足交换与结合
- int a=甲 int b=乙
a=a^b; a=甲^乙 b=乙
b=a^b; a=甲^乙 b=甲乙乙
a=a^b; b=甲 a=甲乙甲
tip:a,b的地址区不能相同
public static void demo1(int [] arr){
int err = arr[0];
for (int i = 1; i < arr.length; i++) {
err=err^arr[i];
}
System.out.println(err);
}
/*
利于多次异或最后只剩下a^b
对a,b进行分类利用最右侧的1进行分类分别进行异或
*/
public static void demo2(int [] arr){
int err=arr[0];
int err1=0;
for (int i = 1; i <arr.length ; i++) {
err=err^arr[i];
}
int only_one=err&(~err+1);//取出err最右边的1
for (int z = 0; z < arr.length; z++) {
if((arr[z]&only_one)==1){
err1=arr[z]^err1;
}
}
int temp=err1^err;
System.out.println(err1+"另一个"+temp);
}
public static void insert(int[] arr){
for (int i = 1; i < arr.length; i++) {
for (int j = i; j <arr.length&&j>=0 ; j--) {
if (arr[i]<arr[j]){
swap(i,j,arr);
}
}
}
}