算法基础(1)

230 阅读2分钟
1.衡量一个算法好坏的三个指标

时间复杂度(最差的情况)、空间复杂度、常数项(直接大样本测试)

2.位运算
>>带符号位右移,>>>不带符号位右移

例如:

001 >> 1 = 000
101 >> 1 = 110
最高位拿原来数字的符号位补
001 >>> 1 = 000
101 >>> 1 = 010
最高位直接拿0补
3.选择排序

题目是这样的:就是给你1-n个数,你先从1-n中选个最小的数,然后将他和1位置的数交换;然后你从2-n中选个最小的数,然后将他和2位置的数交换,这个过程一直持续直到n-n中选一个最小的数,然后将他和n位置的数据交换。请你将上述过程手撕代码。

4.冒泡排序

题目是这样的,就是给你1-n个数,你先选择1-n范围的数进行操作,1位置的数和2位置的数比较,如果谁小就放到2位置,然后2位置和3位置的数比较,如果谁小就放到3位置,直到n-1位置的数和n位置的数进行比较,如果谁小就放到n位置;接下来选择1-n-1范围的数进行操作,和上述过程一样,直到选择1-1位置的数操做。请你将上述过程手撕代码。

5.插入排序

题目是这样的,就是给你1-n个数,你先选择1-1范围的数让他有序,天然有序,然后你选择1-2范围的数让他有序,2位置的数和他左边的数比较,谁小放到1位置,一直往左比较,除非他的左边没数了或者他左边的数比它还小就停止比较,持续这个过程到选择1-n范围的数。请你将上述过程手撕代码。

6.算法怎么学习

明确知道怎么算的算法
不是很清楚,但是知道怎么试的算法(考验你递归的能力)
7.对数器

对数器主要是用来比较你写的方法和暴力方法的结果是否一致。

随机生成器:
Math.random() => [0,1)
Math.random() * N => [0,N)
(int)(Math.random() * N) => [0,N-1] 

因此生成任意随机长度任意随机最大的数的数组:

public class Test {
    public static void main(String[] args) {
        int[] generate = generate(3, 3);
        System.out.println(generate.length);
        for (int i : generate) {
            System.out.println("i = " + i);
        }
    }

    private static int[] generate(int maxSize,int maxValue){
        int[] arr = new int[(int)((maxSize+1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) ((maxValue + 1) * Math.random());
        }
        return arr;
    }
}