算法前置知识01-位运算、简单排序

 一、打印一个int的32位二进制信息

public static void print(int num) {
        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1 << i)) == 0 ? "0" : "1");
        }
        System.out.println();
    }

关于位的一些知识:

1)  左移: 00100<<1=01000
    右移:>>(高位用符号位补)   >>>(高位用符号位补)
2)  与运算:4(0100)&15(1111)= 4(0100)
          2(0010)&1(0001)= 0
    或运算:  |  有一个为1该位为1
    亦或:    ^  不同为1,相同为0                 
    ~取反: ~0100=1011
3)  int二进制存储,32位,最高位标记正负,0代表正,1代表负数
    负数(-n)= ~n + 1;
    特殊:-Integer.MIN_VALUE = Integer.MIN_VALUE;

二、选择排序

public static void selectSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                minIndex = arr[minIndex] <= arr[j] ? minIndex : j;
            }
            if (minIndex != i){
                int temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
        }
    }

选择排序流程分析

1、遍历0到n-1选出最小值与0位置交换(此时0位置比任何一个1到n-1的数字都要小)
2、遍历1到n-1选出最小值与1位置交换(因为0位置比任何一个1到n-1都要小,从1位置开始就好,
   且此时1位置比任何一个2到n-1都要小)
3、遍历2到n-1选出最小值与2位置交换(此时2位置比任何一个3到n-1的数字都要小)
4、最终数组样子(0到n-1最小),(1到n-1最小),(2到n-1最小)......

三、冒泡排序

public static  void bubbleSort(int[] arr){
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = arr.length; i > 0; i--) {
            for (int j = 1; j < i; j++) {
                if (arr[j-1] > arr[j]){
                    int temp = arr[j-1];
                    arr[j-1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

冒泡排序流程分析

1、(0到n-1)0位置与1位置比较,大的放1位置,1位置与2位置比较,大的放2位置
    ......n-2与n-1比较,大的放n-1,n-1是最大值
2、(0到n-2)0位置与1位置比较,大的放1位置,1位置与2位置比较,大的放2位置
    ......n-3与n-2比较,大的放n-2,n-2是最大值
3、(0到n-3)最大值到n-3,(0到n-4)最大值到n-4......直至结束

四、插入排序

public static void insertSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = 1; i < arr.length; i++) {
            for (int j = i - 1; j >= 0 && arr[j + 1] < arr[j]; j--) {
                int temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        }
    }

插入排序流程分析

1、保证0-1有序,1位置与0位置比较,若1位置比0位置小交换,不论结果如何,已到数组边界,结束
2、保证0-2有序,2位置与1位置比较,若2位置比1位置小交换,接过程1
                             若2位置比1位置大,结束,因为0-1是有序的)
3、保证0-3有序,3位置与2位置比较,若3位置比2位置小交换,接过程2
                             若3位置比2位置大,结束
4、重复直至结束   

疑惑:怎么感觉插入排序跟冒泡排序一样啊?

虽然它们的最坏情况是一样的,但是插入排序找到位置后流程就进入下一阶段,循环停止,而冒泡排序还要把循环走完,这个自己人脑debug以下,对着代码走一遍流程不难发现

本篇结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值