算法1---异或与插入排序(golang)

71 阅读1分钟

该系列是学习左神教程的笔记

算法

  • 交换位置

a^a=0
a^0=a

好处是不用开辟而外的空间,要注意的是i和j必须指向不同的内存空间,不然会被置为零

```go
  func swap(arr []int, i, j int) {
	arr[i] = arr[i] ^ arr[j]
	arr[j] = arr[i] ^ arr[j] //这里等同于 arr[i] ^ arr[j]^ arr[j] 变成了arr[i]
	arr[i] = arr[i] ^ arr[j] //等同于arr[i] ^ arr[j]^arr[i] 变成arr[j]
}
```
  • 寻找不为偶数个的一种奇数 如{1,2,1,3,3,4,5,4,5,1,1},返回2

    func find(arr []int) {
    	eor := 0
    	for _, a := range arr {
    		eor ^= a //其它偶数个的都^成0
    	}
    	fmt.Println(eor2)
    }
    
  • 寻找不为偶数个的两种奇数 如{1,2,1,3,3,4,5,4,5,1,1,5},返回2,5

    arr := []int{1, 1, 2, 2, 3, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6}
    func find(arr []int) {
    	eor := 0
    	for _, a := range arr {
    		eor ^= a
    	}
    	eor1 := eor & (^eor + 1) //与上取反加一  得到最右边为1
    
    	eor2 := 0
    	for _, a := range arr {
    		if eor1&a == 1 //取最右边为1的所有数,得到a or b 和其他数(这里其他数必定是偶数个可以消掉),全部异或得到a or b  {
    			eor2 ^= a
    		}
    	}
    	fmt.Println(eor2, eor^eor2) //这里就是a^b^a,或者a^b^b 得到另一个
    }
    
  • 插入排序

    {7, 1, 2, 6, 3, 4, 6, 2, 1} 先排7,1 得到{1,7, 2, 6, 3, 4, 6, 2, 1} 再排 172 得到{1,2,7 6, 3, 4, 6, 2, 1} 以此类推,类似摸扑克牌,往左边插入 最大复杂度O(n^2)

    func insert(arr []int) {
    	//arr := []int{7, 1, 2, 6, 3, 4, 6, 2, 1}
    	for i := 1; i < len(arr); i++ {
    
    		for j := i - 1; j >= 0 && arr[j+1] < arr[j]; j-- {
    			arr[j+1] = arr[j+1] ^ arr[j]
    			arr[j] = arr[j+1] ^ arr[j]
    			arr[j+1] = arr[j+1] ^ arr[j]
    		}
    	}
    	fmt.Println(arr)
    }