首先请欣赏这段视频
00x01插入排序
每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置,图片演示如上,时间复杂度 O(n^2),C++ 代码如下:
00x02希尔排序(Shell Sort)
这个是插入排序的修改版,根据步长由长到短分组,进行排序,直到步长为1为止,属于插入排序的一种。代码实现如下
00x03基数排序(Radix Sort)
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。排序过程是将所有待比较数值统一为同样的数位长度,数位较短的数前面补零,然后从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。排序代码实现如下:
00x04冒泡排序
每次选择两个元素,按照需求进行交换(比如需要升序排列的话,把较大的元素放在靠后一些的位置),循环 n 次(n 为总元素个数),这样小的元素会不断 “冒泡” 到前面来,时间复杂度O(n^2),C++ 代码如下:
00x05归并排序(Merge Sort)
归并排序相比较之前的排序算法而言加入了分治法的思想,其算法思路如下:
1.如果给的数组只有一个元素的话,直接返回(也就是递归到最底层的一个情况)
2.把整个数组分为尽可能相等的两个部分(分)
3.对于两个被分开的两个部分进行整个归并排序(治)
4.把两个被分开且排好序的数组拼接在一起
代码演示如下:
00x06堆排序(Heap Sort)
堆排序是一种基于二叉堆(Binary Heap)结构的排序算法,所谓二叉堆,我们通过完全二叉树来对比,只不过相比较完全二叉树而言,二叉堆的所有父节点的值都大于(或者小于)它的孩子节点,像这样:
- 最大堆中的最大元素值出现在根结点(堆顶)
- 堆中每个父节点的元素值都大于等于其孩子结点
建立堆函数
堆排序的方法如下,把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个时结束。
堆排序函数
00x07桶排序(Bucket Sort)
桶排序的原理是将数组分到有限数量的桶中,再对每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后将各个桶中的数据有序的合并起来。
00x08快速排序(Quick Sort)
简称快排,时间复杂度并不固定,如果在最坏情况下(元素刚好是反向的)速度比较慢,达到 O(n^2)(和选择排序一个效率),但是如果在比较理想的情况下时间复杂度 O(nlogn)。
- 永远选择第一个元素
- 永远选择最后一个元素
- 随机选择元素
- 取中间值
整个快速排序的核心是分区(partition),分区的目的是传入一个数组和选定的一个元素,把所有小于那个元素的其他元素放在左边,大于的放在右边。
算法导论中给出的分区算法伪代码如下:
其思路是每次从最左元素中选择一个元素并且将小于等于那个元素的元素的下标标记为 i ,在整个遍历过程中,如果我们找到一个更加小的元素,我们就把这
个元素和数组中第 i 个元素交换,一个例子如下(摘自 GeeksForGeeks):
00x09Bogo 排序
在计算机科学中,Bogo 排序(bogo-sort)是个既不实用又原始的排序演算法,其原理等同将一堆卡片抛起,落在桌上后检查卡片是否已整齐排列好,若非就再抛一次。其名字源自 Quantum bogodynamics,又称 bozo soart 、blort sort 或猴子排序(参见无限猴子定理)。
C 代码实现:
本文作者为Mr.Bai,转载请注明。
养成写笔记的习惯真好
养成写笔记的习惯真好
很厉害的笔记呀,值得学习
数据结构非常不错的,值得支持的
@瑕瑕@瑕瑕:只是其中的经典算法,数据结构让人头皮发麻