左程云算法课笔记一

选择排序

选择排序的思想很简单,特别容易理解,先找到整个数组中最小的数字,将它和第一个数字交换位置,一轮循环结束;第二轮在剩余的数中找到一个最小值,并将其与数组中的第二个数字交换位置,以此类推…

插入排序

与选择排序一样,当前要插入的索引位置之前的数字都是有序的;不同的是 插入排序所需的时间取决于输入数字的顺序。插入排序不是交换数字的顺序,而是将插入位置后面的原元素全部向后移动。
最好的是顺序,时间复杂度为O(N),如果为逆序的话 这是最糟糕的情况 O(N2)。

以上版权声明:本文为CSDN博主「亓苏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Amethyst128/article/details/73500040
   public static void sort(int[] arr) {
    if (arr==null||arr.length <2){
        return;
    }
    for (int i = 0; i < arr.length; i++) {
        for (int j = i-1; j >=0&&arr[j]>arr[j+1] ; j--) {
            swap(arr,j, j+1);
        }
    }
}

这里有一个很巧的点,就是j=i-1,这里就巧在不用担心数组越界了,它每次都是和上一个比较,而上一个数是必定存在的。
对数器:是一个需要自己编写的测试算法的工具,以下是相关文章
https://blog.csdn.net/u011679785/article/details/97117250
位运算比乘除运算快
异或运算^
n^ n=0 n^0=n
交换操作(骚操作,还是不用好)
不需要额外变量(保证两个变量内存不一样,值可以一样)
原因:n ^ n=0;
a 和 b看成两个东西,值一样并不影响

a=a ^ b; //甲 ^ 乙
b=a ^ b; // 甲 ^乙 ^ 乙
a=a ^ b; // 甲 ^ 乙 ^ 甲

算法题1:将一个int型的数的最右边的 1取出来,如 100100 (2) 取出来就是 100 (2);
解法:N &(~N + 1)
~ N 将N取反

算法题2:一个数组arr中有两种数出现了奇数次,其它的为偶数次,求出这两个数。
解法
1、将数组异或得到a ^ b;
2、得到最右边的1;(说明a 和 b 在这位n上不同)
3、将arr分为两个部分(在n位置上不同的两部分)
4、分别异或得到a、b;

 public void printAB(int[] arr){
        int eor=0;
        for (int i = 0; i < arr.length; i++) {
            eor ^=arr[i];
        }
        int rightOne=eor & (~ eor +1);//取最右侧的1
        int onlyOen =0;
        for (int i = 0; i < arr.length; i++) {
            if( (arr[i] & rightOne) !=0){
                onlyOen ^= arr[i];
            }
        }
        int a=onlyOen;
        int b=eor ^ onlyOen;
    }

算法题3:求出一个int型整数n的2进制数的1的个数
解法

  1. 求出最右边的1;onlyone=N &(~N + 1)
  2. conut++;
  3. 去掉n的最右边的1;n ^= onlyone
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值