这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记。
本篇文章是记录青训营上课过程中的笔记,课程是《数据结构和算法》。本身我是对数据结构很肝兴趣的,所以写一遍文章来记录一下。从这门课程中,我认识到了我们平常学习的数据结构和算法和生产日常使用的数据结构和算法,两者的区别。
数据结构和算法几乎存在于程序开发中的所有地方,如避免单机压力过大,使用主从算法、分片算法。使用LRU算法降低缓存的压力等。
排序算法:
插入排序:插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序 列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经 有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位 置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以, 相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳 定的。
快速排序: 快速排序有两个方向,左边的i下标一直往右走,当a[i] <= a[center_index],其中center_index是 中枢元素的数组下标,一般取为数组第0个元素。而右边的j下标一直往左走,当a[j] > a[center_index]。如果i和j都走不动了,i <= j,交换a[i]和a[j],重复上面的过程,直到i > j。 交换 a[j]和a[center_index],完成一趟快速排序。在中枢元素和a[j]交换的时候,很有可能把前面的元 素的稳定性打乱,比如序列为5 3 3 4 3 8 9 10 11,现在中枢元素5和3(第5个元素,下标从1开始 13 cout<<"visit:"<data<right; 16 17 } 18 19} 计)交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法,不稳定发生在中枢 元素和a[j] 交换的时刻。
堆排序:我们知道堆的结构是节点i的孩子为2 * i和2 * i + 1节点,大顶堆要求父节点大于等于其2个子节 点,小顶堆要求父节点小于等于其2个子节点。在一个长为n 的序列,堆排序的过程是从第n / 2开 始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的选择当然不会 破坏稳定性。但当为n / 2 - 1, n / 2 - 2, ... 1这些个父节点选择元素时,就会破坏稳定性。有可 能第n / 2个父节点交换把后面一个元素交换过去了,而第n / 2 - 1个父节点把后面一个相同的元素 没 有交换,那么这2个相同的元素之间的稳定性就被破坏了。所以,堆排序不是稳定的排序算法。
在补提长度的序列中,这些算法的效率:
| 无序的序列 | 哪种算法最快 |
|---|---|
| 短序列 | 插入排序 |
| 中序列 | 快速排序 |
| 长序列 | 快速排序 |
| 有序的序列 | 哪种算法最快 |
|---|---|
| 短序列 | 插入排序 |
| 中序列 | 插入排序 |
| 长序列 | 插入排序 |