认识复杂度和简单排序算法

参考视频:一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵) 点击观看

文章目录


选择排序

java 复制代码
public class Main {
    public static void main(String[] args) {
        //选择排序
        int[] a = {5, 4, 3, 2, 1};
        for (int i = 0; i < a.length; i++) {
            int min = i;
            for (int j = i + 1; j < a.length; j++) {
                if (a[j] < a[min]) {
                    min = j;
                }
            }
            int temp = a[i];
            a[i] = a[min];
            a[min] = temp;
        }
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }
}

冒泡排序

java 复制代码
public class Main {
    public static void main(String[] args) {
        //冒泡排序
        int[] arr = {1, 5, 3, 2, 4};
        for (int i = arr.length - 1; i > 0 ; i--) {
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        for (int k = 0; k < arr.length; k++) {
            System.out.print(arr[k] + " ");
        }
    }
}

异或运算

  1. 0^n=nn^n=0
  2. 满足交换律和结合律:a^b=b^a(a^b)^c=a^(b^c)
  3. 一堆数字统一异或在一起形成一个数的值与这一堆数字选择谁先异或谁后异或的顺序没有关系。

swap

java 复制代码
public class Main {
    public static void main(String[] args) {
        //交换两个数使用中间变量
        int a = 1;
        int b = 2;
        int temp = a;
        a = b;
        b = temp;
        System.out.println(a);
        System.out.println(b);
        System.out.println("---");
        //交换两个数使用异或
        int a1 = 3;
        int b1 = 4;
        a1 = a1 ^ b1;
        b1 = a1 ^ b1;
        a1 = a1 ^ b1;
        System.out.println(a1);
        System.out.println(b1);
    }
}


注意: 不能交换指向同一内存地址的变量如果两个变量本质上是同一个内存地址(比如 swap(arr[i], arr[i]),或 a = b 指向同一引用),执行异或交换会导致变量值被清零。

题目

  1. 在一个数组中已知只有一种数出现了奇数次,其他的所有数都出现了偶数次,怎么找到出现了奇数次的数?
  2. 在这个数组中已知有两种数出现了奇数次,其他的所有数都出现了偶数次,怎么找到出现的这两种奇数次的数?
  3. 要求时间复杂度为O(n),空间复杂度为O(1)

java 复制代码
public class Main {
    public static void main(String[] args) {
        //在一个数组中已知只有一种数出现了奇数次,其他的所有数都出现了偶数次,怎么找到出现了奇数次的数?
        int[] arr = {1, 2, 3, 2, 1, 4, 4, 4, 4};
        System.out.println(findOddNum(arr));
    }
    public static int findOddNum(int[] arr) {
        int res = 0;
        for (int i = 0; i < arr.length; i++) {
            res ^= arr[i];
        }
        return res;
    }
}





int rightOne = eor & (~eor + 1);//获取一个非零数的最右侧的1

java 复制代码
public class Main {
    public static void main(String[] args) {
        int[] arr = {2, 2, 3, 4, 4, 6, 7, 7, 9, 9};
        singleNumber(arr);
    }
    public static void singleNumber(int[] nums) {
        int eor = 0;
        for (int i = 0; i < nums.length; i++) {
            eor ^= nums[i];
        }
        //eor = a^b
        //eor != 0
        //eor一定有一个位置上是1
        int rightOne = eor & (~eor + 1);//获取eor最右侧的1
        int onlyOne = 0;//eor'
        for (int i = 0; i < nums.length; i++) {
            //选择一边
            if ((nums[i] & rightOne) != 0) {
                onlyOne ^= nums[i];
            }
        }
        System.out.println(onlyOne);//a或者b
        System.out.println(eor ^ onlyOne);
    }
}

插入排序

java 复制代码
public class Main {
    public static void main(String[] args) {
        //插入排序
        int[] arr = {5, 4, 3, 2, 1};
        //0~0有序
        for (int i = 1; i < arr.length; i++){//0~i做到有序
            for(int j = i-1; j >= 0 && arr[j] > arr[j+1]; j--){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

二分

在一个有序 数组中,找某个数是否存在。

时间复杂度:O(log2N)

在一个有序数组中,找到>=某个数最左侧的位置。

相关推荐
IronMurphy7 小时前
【算法四十三】279. 完全平方数
算法
lee_curry7 小时前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
墨染天姬7 小时前
【AI】Hermes的GEPA算法
人工智能·算法
papership7 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826527 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
九转成圣8 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
Beginner x_u8 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
直奔標竿8 小时前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
金銀銅鐵9 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端