1. 程式人生 > 其它 >一些簡單排序與或非運算

一些簡單排序與或非運算

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),這個跟冒泡不一樣,冒泡不管是不是都直接要交換,插入排序比冒泡會好一點
}