Bootstrap

十大排序算法——选择合适的排序(下)(C++)

目录

前言

六、希尔排序(Shell Sort) 

1.原理:

2.效率:

3.适用场景:

4.代码实现:

七、堆排序(Heap Sort) 

1.原理:

2.效率:

3.适用场景:

4.代码实现:

八、计数排序(Counting Sort) 

1.原理:

2.效率:

3.适用场景:

4.代码实现:

九、桶排序(Bucket Sort) 

1.原理:

2.效率:

3.适用场景:

4.代码实现:

十、基数排序(Radix Sort) 

1.原理:

2.效率:

3.适用场景:

4.代码实现:

总结:


前言

继十大排序算法——选择合适的排序(上)(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)。 
;