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

参考视频:一周刷爆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)

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

相关推荐
MSTcheng.2 小时前
【算法】前缀和:『560. 和为 K 的子数组 & 1314.矩阵区域和』
线性代数·算法·矩阵
luckycoding2 小时前
739. 每日温度
算法·leetcode·职场和发展
一只黑鸟2 小时前
基于STM32的罐装水泥成分实时检测系统设计与实现(含有matlab仿真)
stm32·嵌入式硬件·算法·matlab·毕设
StackNoOverflow2 小时前
Maven 核心知识整理
java·maven
ekkcole2 小时前
easyexcel2.2.10版本对本地文件指定行或多行样式处理
java·easyexcel
小七mod2 小时前
【Nacos】Nacos1.4.x服务注册源码分析
java·spring cloud·微服务·nacos·源码·集群·注册中心
于先生吖2 小时前
Java 打车小程序 APP 源码 顺风车滴滴跑腿系统完整实现
java·开发语言·打车系统
凌冰_2 小时前
IDEA2025 基于 Jakarta EE 开发 Servlet + Thymeleaf
java·servlet
@我漫长的孤独流浪2 小时前
C算法设计与分析------程序设计代码
数据结构·c++·算法