DSA之十大排序算法 十大排序算法汇总(C++)

2019年10月30日16:09:07
时至今日,也面了这么多家公司。基本上排序算法是必问必考必写的,到现在为止 我手写过堆排序、快速排序、希尔排序、归并排序等(还有一个长相十分好看的面试官小姐姐 让我手写了桶排序,唉)。

但是总体上来说不难,这些算法很基础 没什么难度。本来之前已经把DSA之十大排序算法 全都分析过了,但是一直没有进行汇总。今天 西安难得天气不错(我也收到了一家公司的offer通知),我就再把这个系列的算法进行一个大串烧。
开始!!!

算法分类标准

一、内部排序和外部排序

排序算法根据是否使用内外存进行分类,为内部排序和外部排序。首先内部排序指的是数据记录在内存中直接进行排序,而外部排序是因排序的数据量很大,一次不能容纳全部的排序记录,所以在排序过程中需要进行访问外存的操作。 (数据量很大,因此就把数据放在磁盘中,而排序则还需要通过磁盘和内存的数据传输才能进行)。通常情况下,大家所熟知的八大排序指的就是内部排序。如下图所示:
在这里插入图片描述

二、是否进行元素比较

通常情况下,也是基于排序过程中是否要进行 元素之间的两两比较,而划分为:

  • 非线性时间比较类排序:通过相互比较来决定元素间的先后相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
  • 线性时间非比较类排序:排序过程中,不通过比较来决定元素间的相对次序。因此它可以突破基于比较排序的时间界限,以线性时间运行,因此称为线性时间非比较类排序。

如下图所示:在这里插入图片描述

算法常用术语

  1. 比较和非比较:常见的快速排序、归并排序、堆排序、冒泡排序等都属于比较排序。在排序的最终结果里,元素之间的次序依赖于它们相互之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。在冒泡排序之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²)。而在归并排序、快速排序之类的排序中,问题规模通过分治法消减为logN次,所以时间复杂度平均O(nlogn)。比较排序的优势:适用于各种规模的数据,也不在乎数据的分布,都能进行排序。可以说,比较排序适用于一切需要排序的情况。
  2. 而下面的计数排序、基数排序、桶排序则属于非比较排序。非比较排序是通过确定每个元素之前,应该有多少个元素来排序。针对数组src,计算src【i】之前有多少个元素k,则唯一确定了src【i】在排序后数组中的位置。非比较排序只要确定每个元素之前的已有的元素个数即可,所有一次遍历即可解决。算法时间复杂度O(n)。非比较排序时间复杂度比较低,但由于非比较排序需要占用空间来确定唯一位置。所以对数据规模和数据分布有一定的较高要求的。
  3. 稳定和不稳定:稳定:如果a原本在b前面,且a=b,排序之后a仍然在b的前面;
    不稳定:如果a原本在b的前面,且a=b,排序之后a可能出现在b的后面。

算法时空复杂度及性质

在这里插入图片描述

DSA之十大排序算法 实现

注:十大排序算法 都有详细的分析,实现和优化。如下:

  1. DSA之十大排序算法第一种:Bubble sort
  2. DSA之十大排序算法第二种:Straight Selection Sort
  3. DSA之十大排序算法第三种:Straight Insertion Sort
  4. DSA之十大排序算法第四种:Shell Sort
  5. DSA之十大排序算法第五种:Merge Sort
  6. DSA之十大排序算法第六种:Quick Sort
  7. DSA之十大排序算法第七种:Heap Sort
  8. DSA之十大排序算法第八种:Counting Sort
  9. DSA之十大排序算法第九种:Bucket Sort
  10. DSA之十大排序算法第十种:Radix Sort

基本上,上面都有详细的代码,也可以看我的GitHub:https://github.com/TsinghuaLucky912/My_own_C-_study_and_blog/tree/master/Sorting_Algorithm%20-10

猜你喜欢

转载自blog.csdn.net/weixin_43949535/article/details/102821405