这是我参与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个排序要用的工具类,写的比较随意,但是能用。
- 生成随机数组
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;
}
- 验证数组是否已排序
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;
}
- 两个值交换,Java的交换比较特殊
public static void swap(Integer[] arr, int a, int b) {
Integer temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}