一些简单排序与或非运算
package 排序;
public class 交换 {
public static void main(String[] args) {
int a = 12;
int b = 23;
a = a^b;
b = a^b;
a = a^b;
System.out.println(a);
System.out.println(b);
}
//利用^运算来实现交换
}
^运算的几点性质
1.0^N = N, N^N = 0
2.无进位加法
3.交换结合
//只有一个奇数其他都是偶数
package 排序;
public class 一奇其他都是偶数 {
public static void main(String[] args) {
int []a = {1,1,5,6,5,6,9};
int eor = 0;
for(int i = 0; i < a.length; i ++)
{
eor = eor^a[i];
}
System.out.println(eor);
}
}
//^运算满足交换律,结合律嗷嗷
package 排序;
public class 二奇其他都是偶数 {
public static void main(String[] args) {
int []a = {1,1,2,3,5,3,6,5};//2,6
int eor = 0;
for(int cur:a)
{
eor = cur^eor;
}
//eor =2^6
int zuo = eor&(~eor + 1);//找到最右边为1的,可以让他划分区域
int eor1 = 0;
for(int cur : a)
{
if((zuo&cur)==0)
{
eor1 = cur^eor1;
}
}
System.out.println("第一个数" + eor1 +" "+ "第二个数"+ (eor^eor1));
}
}
插入排序我利用自己随机生成的数来进行排序
package 排序;
import java.util.Arrays;
import static java.util.function.Predicate.isEqual;
public class 插入排序 {
public static void main(String[] args) {
int time = 10;
int maxsize = 100;
int maxvlaue = 100;
boolean success = true;
for(int i = 0 ; i < time; i ++)
{
int []arr1 = getrandomarr(maxsize,maxvlaue);
sort(arr1);
int []arr2 = Arrays.copyOf(arr1,arr1.length);
Arrays.sort(arr2);
if(!arr1.equals(arr2))
{
success = false;
System.out.println("失败");
break;
}
}
}
public static int[] getrandomarr(int maxsize, int maxvlaue)
{
//(int)(Math.random() * N)
int []arr = new int[(int)(Math.random() * (maxsize + 1))];//随机长度
for(int k = 0; k < arr.length; k++)
{
arr[k] = (int)(Math.random() * (maxvlaue + 1)) - (int)(Math.random() * (maxvlaue + 1));//两个随机值相减表示随机数也随机
}
return arr;
}
//dui'shu'qi
public static void sort(int []a)
{
//0-0
//0-i
for(int i = 1;i < a.length ; i ++)
{
for(int j = i-1;j>=0 && a[j] > a[j + 1]; j--)
{
swap(a,j,j+1);
}
}
/*for(int cur:a)
{
System.out.print(cur +" ");
}
System.out.println("//");*/
}
public static void swap(int []a,int j,int k)
{
a[j] = a[j]^a[k];
a[k] = a[k]^a[j];
a[j] = a[j]^a[k];
}
//最差的时间复杂O(N^2),这个跟冒泡不一样,冒泡不管是不是都直接要交换,插入排序比冒泡会好一点
}

浙公网安备 33010602011771号