数据结构与算法|青训营笔记

31 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 11 天

1:经典排序算法

插入排序

步骤:

1.从第一个元素开始,该元素可以认为已经被排序

2.取下一个元素a,从已排序的元素序列从后往前扫描

3.如果该元素大于a,则将该元素移到下一位

4.重复步骤3,直到找到已排序元素中小于等于a的元素

5.a插入到该元素的后面,如果已排序所有元素都大于a,则将 a插入到下标为0的位置

6.重复步骤2~5

缺点: 平均和最坏的时间复杂度高达O(N*N);

优点: 最好情况的时间复杂度为O(N);

快速排序

步骤:

(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。 

(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。 

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成。

缺点:

最坏的情况是,每次所选的中间数是当前序列中的最大或最小元素,这使得每次划分所得的子表中一个为空表,另一子表的长度为原表的长度-1。这样,长度为n的数据表的快速排序需要经过n次划分,使得整个排序算法的时间复杂度为O(n2)。

优点:

平均情况整个算法的时间复杂度为O(nlog2n)。

堆排序

操作:

最大堆调整:将堆的末端子节点作调整,使得子节点永远小于父节点

创建最大堆:将堆中的所有数据重新排序

堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算

缺点:

最好情况的时间复杂度为O(n*logn)

优点:

最坏的情况时间复杂度为O(n*logn)

总结:插入算法在短序列中速度最快;快速排序在其他情况中速度最快;堆排序不同情况下区别不大。