算法学习1

1、评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是"常数项时间"

2、位运算符的基本操作:

①与(&):只有当两个对应的位都为1时,结果位才为1,否则为0。例如,5(二进制0101)与3(二进制0011)进行与运算的结果是1(二进制0001)。

②或(|):只要两个对应的位中有一个为1,结果位就为1,两个位都为0时,结果位才为0。。例如,5(二进制0101)或3(二进制0011)进行或运算的结果是7(二进制0111)。

③异或(^):如果两个对应的位不同,则结果位为1,如果相同,则结果位为0.例如,5(二进制0101)异或3(二进制0011)的结果是6(二进制0110)。

性质:0^N=N; N^N=0; 满足交换律和结合律

复制代码
 public  static void swap(int [] arr,int i,int j){
    arr[i]=arr[i]^arr[j];
    arr[j]=arr[i]^arr[j];
    arr[i]=arr[i]^arr[j];
    }

public class YiHuo {
    //一种数,出现了奇数次,其它数,出现了偶数次,找出出现了奇数次的数
    public static void main(String[] args) {

    }
    public static void printOddTimeNum1(int [] arr){
        int eor=0;
        for (int cur : arr) {
            eor^=cur;
        }
        System.out.println(eor);
    }
    public static void printOddTimeNum2(int [] arr){
int eor=0;
        for (int i = 0; i < arr.length; i++) {
            eor^=arr[i];
        }
        //eor=a^b
        //eor!=0
        //eor必然有一个位置上是1
        int rightOne=eor&(~eor+1);//提取出最右的1
        int onlyOne=0;//eor
        for (int cur : arr) {
            if ((cur&rightOne)==1){
                onlyOne^=cur;
            }
        }
        System.out.println(onlyOne+""+(eor^onlyOne));
    }
}

④取反(~):是对一个二进制数的每一位进行取反操作,即将0变成1,1变成0.例如,对5(二进制0101)进行取反运算的结果是-6(二进制1010,注意在计算机中负数通常以补码形式表示)。

⑤左移(<<):左移运算将一个二进制数向左移动指定的位数,右侧补0。例如,5(二进制0101)左移2位的结果是20(二进制10100)。

⑥右移(>>):右移运算将一个二进制数向右移动指定的位数,右侧根据符号位补1或补0.对于无符号数,左侧补0,对于有符号数,如果符号位为0(正数),则左侧补0;如果符号位为1(负数),则左侧补1,每右移一位,相当于迟疑2的1次方(忽略小数部分)。例如,5(二进制0101)右移1位的结果是2(二进制0010)。

2.1、位运算的优先级低于算术运算符

2.2、优点:

效率高:位运算直接操作硬件层面的二进制位,没有复杂的中间过程

内存占用少:位运算允许通过单个位来表示信息的状态

冒泡排序:

复制代码
public class ChaRu {
    public static void insertionSort(int[] arr) {
        if (arr == null || arr.length < 2)
            return;

        //0~0 有序的
        //0~i 想有序
        for (int i = 1; i < arr.length; i++) {
            for (int j=i-1;j>=0&&arr[j]>arr[j+1];j--){
                swap(arr,j,j+1);
            }
        }
    }
    private static void swap(int[] arr, int j, int i) {
        arr[i]=arr[i]^arr[j];
        arr[j]=arr[i]^arr[j];
        arr[i]=arr[i]^arr[j];
    }
}

插入排序

复制代码
public class ChaRu {
    public static void insertionSort(int[] arr) {
        if (arr == null || arr.length < 2)
            return;

        //0~0 有序的
        //0~i 想有序
        for (int i = 1; i < arr.length; i++) {
            for (int j=i-1;j>=0&&arr[j]>arr[j+1];j--){
                swap(arr,j,j+1);
            }
        }
    }
    private static void swap(int[] arr, int j, int i) {
        arr[i]=arr[i]^arr[j];
        arr[j]=arr[i]^arr[j];
        arr[i]=arr[i]^arr[j];
    }
}
相关推荐
祖力553 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省4 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
嘻哈∠※5 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7986 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2586 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
Shell运维手记7 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI7 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型7 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光7 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口