算法学习笔记

目录

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


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

选择排序

/**
     * 选择排序
     * i ~ N-1 选择最小值放入i位置
     *
     * @param arr
     */
public static void selectSort(int[] arr) {
    //判断临界值
    if (null == arr || arr.length < 2) {
        return;
    }
    for (int i = 0; i < arr.length - 1; i++) { // i ~ N-1
        //记录最小值下标
        int target = i;
        for (int j = i + 1; j < arr.length; j++){
            target = arr[target] > arr[j] ? j : target;
        }
        //交换
        swap1(arr,i,target);
        //swap2(arr,i,target);
    }
​
}

冒泡排序

/**
     * 冒泡排序
     * @param arr
     */
public static void bubbleSort(int[] arr) {
    if (arr == null || arr.length < 2) {
        return;
    }
    for (int i = arr.length - 1; i >0; i--) { //需要排序的个数
        for (int j = 0; j < i; j++){ //从1~(i-1)进行比较
            if(arr[j]>arr[j+1]){
                swap1(arr,j,j+1);
            }
        }
    }
}

异或

  • 一个int数组,里面偶数个相同的数存在多个,奇数个相同的数存在一个,请找出这个数

    /**
         * 一个int数组,里面偶数个相同的数存在多个,奇数个相同的数存在一个,请找出这个数
         * @param arr
         */
    public static void getOne(int[] arr){
        //异或的特点:交换率,结合率
        // 0 与任何数^为任何数
        int result = 0;
        for(int item : arr){
            result ^= item;
        }
        System.out.printf("result:= %d\n", result);
    }

    思路:

    根据异或的特点,偶数个数的数异或的结果为0,0与任何数异或为异或,所以结果为奇数个数的数

  • 一个int数组,里面偶数个相同的数存在多个,奇数个相同的数存在两个,请找出这两个数

    /**
         * 一个int数组,里面偶数个相同的数存在多个,奇数个相同的数存在两个,请找出这两个数
         * @param arr
         */
    private static void getTwo(int[] arr) {
        int eor = 0;
        for(int cur : arr){
            eor ^= cur;
        }
        //获取最右边的1
        int rightOne = eor & (~eor + 1);
        int eor1 = 0;
        for(int cur : arr){
            if((cur & rightOne) == 0){
                //分组,筛选出对应位置不同的数
                eor1 ^= cur;
            }
        }
        System.out.printf("a = %d, b = %d\n", eor1 ^ eor , eor1);
    }

    思路:

    假设结果为a,b

    1. 所有数进行异或 eor = a^b

    2. a != b ,所以a 和 b 的二进制存在一个位置不同,假设第8位不同

    3. 将数组分为两部分, 第8位为1,第8位为0

    4. 其中一部分所有数进行异或,结果 eor' = a或者b

    5. eor ^ eor' = a或者b

插入排序

/**
     * 插入排序
     * @param arr
     */
private static void insertSort(int[] arr) {
    //[4,1,3,2]
    //0~1
    //0~2
    //0~3
    //0~4
    if (null != arr && arr.length < 1) {
        return;
    }
    for (int i = 1; i < arr.length; i++) {
        for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
            swap2(arr, j, j - 1);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值