算法之路-如何开始

121 阅读3分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

作为一名长期的CRUD或者说spring工程师,算法甚至从没出现在我的职业生涯中。大学没学过,工作以来99.9%的时间也没用过。我是那种在鄙视链底端的代码打字员,就是又写Java又写业务,业务上就是spring+mybatis一把梭,Java也就增删改查,能有什么机会碰到算法呢,实际上也确实没有。

开个小玩笑,有时候自嘲也未必是件坏事,其实Java或者其他任何语言本质上没有区别,各有优劣,术业有专攻,但Java可以快速实现业务同时也能保证一些性能和安全,招人也方便,这点上别的任何语言都做不到的。Java也在不断进化,至少在Java这条路上深耕下去对饭碗来说是安全的。回到我自身,写了好几年Java业务之后,总有一种在原地踏步的感觉,在寻找各种突破口来提升自己。学习新的框架和架构理念似乎是一条靠谱的路,业务相对稳定,引入新框架新技术的成本太高,如果不用新框架又很难把自己的所学融入到自己的知识体系中。这个时候便想到了算法。

抽象是Java的精髓,算法是所有语言的精髓。同时也是各大公司面试必不可少的环节,临时准备起来还是挺痛苦的。所以把算法当作一个日常的技能训练是一个不错的选择。刚开始会很难,就像健身一样,一个肥宅做俯卧撑难吗?恐怕涨红大脸只能做10个,真的太难了。但如果每天坚持5个,半个月之后每天10个,坚持下去,很快就能做20个,30个。彭于晏说,有时候只有坚持下去才能看到希望。人往往是短视的,意志不坚定就容易被眼前的困难吓倒。

所以不妨就从简单的开始吧。我们总在说排序,不如就从排序开始,慢慢接触,慢慢熟悉。但在开始学排序之前,我们得做一些准备工作。下面分享我的一些小工具出来。

开发工具

算法的练习不需要什么强大的IDE,用vscode或者idea的community版本即可,我个人推荐还是第二个,当然如果你有商业版最好了。

新建项目

新建一个基础的maven项目就好了。为什么要用maven呢,当要用到什么工具类时可以随便添加依赖,也可以写单测来做一些验证,就不要总是用main函数了。

工具类

简单分享2个排序要用的工具类,写的比较随意,但是能用。

  1. 生成随机数组
public static Integer[] genRandomArray(Integer size, Integer start, Integer end) {
    Integer[] arr = new Integer[size];
    Random random = new Random(System.currentTimeMillis());
    for (int i = 0; i < size; i++) {
        arr[i] = random.nextInt(end - start + 1) + start;
    }
    return arr;
}
  1. 验证数组是否已排序
public static void testSort(String funcName, BiConsumer<Integer[], Integer> biConsumer,
                            Integer[] arr, Integer size) {
    long start = System.currentTimeMillis();
    biConsumer.accept(arr, size);
    long end = System.currentTimeMillis();
    long timeSec = (end - start) / 1000;
    System.out.println(funcName + ": " + timeSec + "s");
    assert isSorted(arr, size);
}

public static boolean isSorted(Integer[] arr, Integer size) {
    for (int i = 0; i < size - 1; i++) {
        if (arr[i] > arr[i + 1]) {
            return false;
        }
    }
    return true;
}
  1. 两个值交换,Java的交换比较特殊
public static void swap(Integer[] arr, int a, int b) {
    Integer temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}