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

算法

  • 交换位置

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)
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值