【21天打卡】前端攻城狮重学算法之--十大排序算法比较

活动地址:CSDN21天学习挑战赛

合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。

作为一名前端攻城狮,为了成为更好的自己,我参加了这次21天算法打卡。

这是第3天,2022年08月03日,星期三。今天也要加油鸭!

创作计划


【21天打卡】前端攻城狮重学算法之-顺序查找

【21天打卡】前端攻城狮重学算法之-直接插入排序

学习计划

**
1,学习目标

今日搞懂十大排序算法,有一些程序思维和逻辑

2,学习内容

网上

3,学习时间

第3天:2022.08.03 09:00-12:00

4,学习产出

CSDN技术博客 1 篇

**

学习日记

1.排序算法分类

【21天打卡】前端攻城狮重学算法之--十大排序算法比较_第1张图片

排序的目的是将一组“无序”的记录序列调整为“有序”的记录序列。

a、根据待排序的数据大小不同,使得排序过程中所涉及的存储器不同,可分为: 内部排序(内存即够,以下十个算法均为内部排序) 、外部排序 (还需访问外存)

b、排序关键字可能出现重复,根据重复关键字的排序情况可分为: 稳定排序(排序后重复关键字记录的相对次序保持不变) 、不稳定排序 

c、对于内部排序,依据不同的排序原则,可分为: 插入排序、交换(快速)排序 、选择排序 、归并排序 、计数排序

d、针对内部排序所需的工作量划分,可分为: 简单排序 O(n^2) 、先进排序 O(nlogn) 、基数排序 O(d*n)

e、十种常见排序算法可以分为两大类:

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

 2.十大排序算法时间复杂度,空间复杂度,稳定性比较

(图片来源于网络) 

【21天打卡】前端攻城狮重学算法之--十大排序算法比较_第2张图片

名词解释:

  • n:数据规模;
  • k:桶的个数;
  • In-place: 占用常数内存,不占用额外内存;
  • Out-place: 占用额外内存。
  • 稳定:如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。 比如: a 原本在 b 前面,而 a = b,排序之后,a 仍然在 b 的前面;
  • 不稳定:如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序改变。 比如:a 原本在 b 的前面,而 a = b,排序之后, a 在 b 的后面;

3.十大排序算法比较

【21天打卡】前端攻城狮重学算法之--十大排序算法比较_第3张图片

4.排序算法的选择:

每种排序算法都各有优缺点。因此,在实用时需根据不同情况适当选用,甚至可以将多种方法结合起来使用。

影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的。相反,有时平均时间复杂度高的算法可能更适合某些特殊情况。同时,选择算法时还得考虑它的可读性,以利于软件的维护。一般而言,需要考虑的因素有以下四点: 

a、待排序的记录数目n的大小; 

b、记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小; 

c、关键字的结构及其分布情况; 

d、对排序稳定性的要求。

设待排序元素的个数为n:

1)当n较大,则应采用时间复杂度为O(nlog2n)的排序方法: 快速排序、堆排序或归并排序序。

快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。

堆排序 : 内存空间允许且要求稳定性的。

归并排序:它有一定数量的数据移动,所以可通过与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。 

2)当n较大,内存空间允许,且要求稳定性:归并排序 。

3)当n较小,可采用直接插入或直接选择排序。 

4)一般不使用或不直接使用传统的冒泡排序。 

5)基数排序 ,它是一种稳定的排序算法,但有一定的局限性: 

5.排序算法详解:

5.1、插入排序(Insertion Sort)

从头开始,不断地将当前数据插入到之前排好的数据中,直到最后一个。
时间复杂度:o(n^2)
空间复杂度:o(1)
稳定性:稳定
优点:效率略高于选择和冒泡,稳定
缺点:效率不高

5.2、希尔排序(Shell Sort)

将一组数据分成若干组,每个组中第一个元素与第二个元素相差“增量”个元素,对每个组进行插入排序,然后逐渐减小增量,分小组,直到增量为1(只有一个组)。
时间复杂度:o(nlogn)
空间复杂度:o(1)
稳定性:不稳定
优点:效率高于三种简单排序,不需要额外空间
缺点:不稳定

5.3、选择排序(Selection Sort)

从头开始,依次找最小的,放在第一个,直到有序
时间复杂度:o(n^2)
空间复杂度:o(1)
稳定性:不稳定
优点:表现最稳定,时间复杂度永远o(n^2),不需要额外空间
缺点:稳定性上讲,不稳定,效率低

5.4、堆排序(Heap Sort)

大顶堆:每个节点的值都大于其左右孩子
将一组数维护成大顶堆,找出堆顶元素拿走(交换堆顶元素和堆底元素,堆的元素个数减一),重新维护成一个大顶堆,重复操作,直到数列有序
时间复杂度:o(nlogn)
空间复杂度:o(n)
稳定性:不稳定

5.5、冒泡排序(Bubble Sort)

从头开始,两两依次比较,直到找出这组数据中最大的,放在最后面,重复此过程,直到有序
时间复杂度:o(n^2)
空间复杂度:o(1)
稳定性:稳定
优点:简单,易实现,不需要额外空间
缺点: 效率低

5.6、快速排序(Quick Sort)

从一组数据中找出一个基准,然后从后向前找比这个基准小的,放在基准位置,然后再从前向后找比基准大的,放在刚刚那个数字的位置,循环此过程,直到基准找到合适的位置,使基准前面的数字小于基准,基准后面的数字大于基准。接着换一个基准重复此方法,直到数列有序。
时间复杂度:o(nlogn)
空间复杂度:o(logn)
稳定性:不稳定
优点:排序速度最快

5.7、归并排序(Merge Sort)

将一个长度为n的数列,两两分组,组的个数>=2,对每个组内排序;再将两个组合并,排序,合并,排序,直到整个数列有序。
时间复杂度:o(nlogn)
空间复杂度:o(n)
稳定性:稳定

5.8、计数排序(Counting Sort)

将输入的数据转化为健存储在额外开辟的数组空间中,输入的数据必须是确定范围的整数。
时间复杂度:O(n+k)
空间复杂度:O(n+k)
稳定性:稳定;

5.9、桶排序(Bucket Sort)

划分多个范围相同的区间,每个子区间自排序,最后合并。
时间复杂度:O(n)
空间复杂度:O(n+k)
稳定性:稳定;
优点:实现简单,在数据量小的情况下性能良好,是稳定的排序算法
缺点:严重依赖于额外的存储空间

5.10、基数排序(Radix Sort)

将一组数按个位元素分别放到0~9(十个桶)中,然后按十个桶的顺序取出(先去0号桶,再取1号桶…),然后按十位元素分十个桶,将数字按十位元素再次放入,再次取出,直到数列有序。
时间复杂度:o(n*k) k:桶的个数
空间复杂度:o(n+k)
稳定性:稳定
缺点:不能对小数排序,只针对整数

以上就是今天的学习,明天见!~

你可能感兴趣的:(算法,学习,算法,数据结构)