系列文章目录
前言
想写点文章又不知道写什么,那就从今天开始先每天记录一点自己的学习内容吧
一、为什么学算法要从排序开始?
之前也在力扣上刷题,每天做一道或难或简单的每日一练,也就当自己每天都很充实。
不过说来惭愧,前段时间常常加班,回家之后实在也没心思再刷题了,
最近项目上线,又恢复闲散状态,忽然想总结下之前做题的通性,
就忽然觉得排序就是算法啊,排序就是最基础又是最经典的算法,翻出我珍藏多年的数据结构与算法,打开算法章节第一章果然就是排序。
恍然大悟,对啊,排序就是最基础最重要的算法,排序于算法来说就像for/if对于编程一样重要。
果然学算法第一步一定要从排序开始
二、排序算法 - 插入排序原理
1.思路
我感觉插入排序算是最贴合人类排序思维的排序方式了。
因为对于我来说插入排序最简单的理解就是打扑克,
我不知道大家打扑克是怎么整理手牌,
我反正就是从左到右一次看应该放在什么位置合适。
2.示例
比如第二张牌有没有比第一张大,大就放第一张右边,小就放第一张左边,这两张就是顺序的队列了;
然后抽出第三张跟前两张比,放在合适的位置,让这三张可以顺序排列,这三张就是顺序的队列了;
然后最后一张牌抽出来,从我已经整理好的牌从右往左依次比,一直到刚好大于左边,小于右边,然后插进去
3.抽象
抽象下就是,
第一个数字默认为已经排序好的有序数组,
从第二个数字开始排序,这个数现在在有序数组的最右侧,
然后跟有序数组中最大数(右边第一个)比较,如果比最大数还要大,那么这个数位置不动,即有序数组在最右侧加上这个数还是有序数组,
否则他比最大数小,就要跟最大数换位置,
然后依次向左跟第二大的数比较并换位置,第三大的数比较并换位置,,,
直到比下一个数大或左边没有下一个数,那就不动了,
即比左边的数大,比右边的数(上一次交换中因为大被换到右边)小,那有序数组就又恢复有序了。
然后后面每一个数分别按照上面的方法逐个插入有序数组中,最后就是一整个的有序数组了。
三、排序算法 - 插入排序代码实现
代码如下:
public int[] insertionSort(int[] a) {
for (int i = 1; i < a.length; i++) {
int check = a[i];
int j;
for (j = i; j > 0 && check < a[j - 1]; j--) {
a[j] = a[j - 1];
}
a[j] = check;
}
return a;
}
总结
第一次正经想写个文章,想从简单的开始,结果写个插入排序一通查资料,稀碎,原理解释的自己都不知道在说啥,算了第一天写,只要能坚持下去就原谅自己了