对比总结常见的排序算法:
选择排序、插入排序、冒泡排序、希尔排序、归并排序、快速排序、计数排序、堆排序、基数排序
排序算法
均默认为升序排列。
选择排序
每次遍历数组,找到未排序中的最小元素,然后放到已排序的末尾位置,直到所有的元素均排序完毕。
1 | def selection_sort(nums): |
冒泡排序
每次比较两个相邻元素,较大的元素每次移动一个位置,不断地冒泡到数组末尾。
1 | def bubble_sort(nums): |
插入排序
每次选择一个数,在前面已排序好的序列中寻找该数字应该所在的位置,并向后移动部分已排序数字,将新数字插入到相应位置。
1 | def insert_sort(nums): |
希尔排序
希尔排序是对插入排序的改进版。在插入排序中, 数字每一次只能移动一个位置,而希尔排序是增加移动间隔,使较小的数字能更加快速地移动到队列头部。
具体算法描述如下:
选择一个增量序列 \(g_1 > g_2>\cdots> g_k\) 且 \(g_k=1\)。
对于每一个增量\(g\), 进行一次排序。
在每次排序中,按照间隔进行一次插入排序。
1 | def shell_sort(nums): |
归并排序
归并排序是一种分治思想,先将数组分为子序列,缩小问题规模,让每个子序列各自有序,然后再将有序的子序列合并成一个完整数组。这样每一次的问题规模都变为原问题的 1/2。
1 | def merge_sort(nums): |
快排
快排是选取一个哨兵位置,将小于哨兵的数据全部放到左边,将大于哨兵的数据全放到右边,然后再用相同的思想对左右两边继续排序。
1 | def quick_sort(nums): |
计数排序
计数排序是开辟额外的空间来存储每个值的出现次数,然后再根据计数填充数组。
1 | def count_sort(nums): |
堆排序
堆排序是使用了堆这个数据结构来进行的排序算法。把一维的数组想象成一个二叉树(堆)结构。
过程如下:
- 建堆,从底向上调整堆,使得父亲节点比孩子节点值大,构成大顶堆;
- 交换堆顶和最后一个元素,重新调整堆。
1 | def heap_sort(nums): |
基数排序
基数排序是针对数字每一位进行排序,从最低位开始排序
1 | def radix_sort(nums): |
对比
下面对排序算法做一个总结和对比。