一些簡單排序與或非運算
阿新 • • 發佈:2021-12-27
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),這個跟冒泡不一樣,冒泡不管是不是都直接要交換,插入排序比冒泡會好一點 }