目录
前言
继十大排序算法——选择合适的排序(上)(C++),本篇文章讲述的是其余排序,希尔排序(Shell Sort),堆排序(Heap Sort),计数排序(Counting Sort),桶排序(Bucket Sort)以及基数排序(Radix Sort)。在本篇文章中,我将会简要的介绍一下其余排序算法,通过学习排序算法,我们可以得到思路的扩充,算法效率的优化,算法的稳定性,以及在不同场景的合适选择。
六、希尔排序(Shell Sort)
希尔排序是插入排序的优化版, 简单来说,就是利用不断缩小间距(gap)实现多次插入的排序过程,随着gap不断减少直至1为止,该序列就已经排好序了。由于是利用间距的排序,因此该排序是不稳定的排序。
1.原理:
- 通过将序列分成若干子序列进行插入排序,逐步缩小子序列的间距。
- 最后当间距变为1的时候对整个序列进行插入排序即可。
2.效率:
- 时间复杂度:最好情况为O(n log n),最坏情况是O(n²) 。平均为取决于间距序列。
- 空间复杂度:O(1)。
3.适用场景:
- 中等规模的数据量。
4.代码实现:
//插入排序
void Insertion_Sort(std::vector<int>& vec , int gap , int n){
for(int i = gap; i < n; i++){
int key = vec[i] , j = i;
while(j >= gap && vec[j - gap] > key){
vec[j] = vec[j - gap];
}
vec[j] = key;
}
}
//希尔排序
void Shell_Sort(std::vector<int>& vec) {
int n = vec.size();
//gap一开始是n的一半,然后从大到小,不断以两倍的速度缩短,直到 1 为止。
for(int gap = n / 2; gap > 0; gap /= 2){
Insertion_Sort(*vec , gap , n);
}
}
注:若是不懂插入排序的可以看十大排序算法——选择合适的排序(上)(C++)进行了解。
七、堆排序(Heap Sort)
堆排序是使用二叉堆来排序,二叉堆是一棵二叉树(并不是倒置的,为了方便初学者学习,这里并没有将其倒置,大家把它当成Y型结构的数就行,Y上方是树枝,Y下面是树根),将序列构建成一个最小堆然后逐个取出堆顶元素(最小值),也就是当前这棵树的树根,放到序列末尾,然后在将其变成最小堆,重复此操作,最终就从小到大排好序了。由于是利用堆排序,则其为不稳定排序。
1.原理:
- 将序列构建成一个最小堆。
- 取堆顶元素,放到序列末尾。
- 重复前两步,直到全部取完为止。
2.效率:
- 时间复杂度:最好、最坏,平均情况均为O(n log n)。
- 空间复杂度:O(1)。