这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。
一、常见排序算法介绍及其时间复杂度
1.插入排序
插入排序在数组前半部分维护一个有序的数组,每次检查有序数组后一个元素,将其插入到有序数组中,有序数组长度加一,直至整个数组完成排序。
最好情况(数组有序)下,插入排序只需遍历数组而不用执行插入操作,其时间复杂度为O(n);最坏情况(数组逆序)和平均情况下复杂度为O(n2)。
2.快速排序
快速排序每次选择一个哨兵元素pivot,然后用两个指针从数组头和数组尾扫描数组,以升序排序为例,头指针扫到一个大于哨兵的元素停止,尾指针找到小于等于哨兵的元素停止,交换头尾指针的元素,然后继续扫描直至头尾指针相遇,将哨兵赋值给所指位置,然后对哨兵前后两个数组分别执行上述过程。
最好情况(每次将数组分为相等两段),复杂度为O(nlogn);最坏情况(数组有序或逆序),相当于冒泡排序,复杂度为O(n2);平均情况下为O(nlogn)。
3.堆排序
堆排序的基本思想是:1、将带排序的序列构造成一个大顶堆,根据大顶堆的性质,当前堆的根节点(堆顶)就是序列中最大的元素;2、将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大顶堆;3、重复步骤2,如此反复,从第一次构建大顶堆开始,每一次构建,我们都能获得一个序列的最大值,然后把它放到大顶堆的尾部。最后,就得到一个有序的序列了。
堆排序和初始序列无关,各种情况下时间复杂度均为O(n*logn),因此较为稳定。
二、排序算法个情况下速度比较
1.元素随机
在元素随机的情况下,分别用三种排序算法(快速排序每次用队首元素当哨兵)对序列长度为16(短)、128(中)和1024(长)的序列进行排序,并对结果进行比较。
结论:插入排序在短序列中最快,快速排序在其他最快,堆排序虽慢于快排,但也差距不大。
2.元素有序
在有序的情况下,插入排序的速度最快。
综上,在短序列和元素有序的情况下,插入排序的效率更高;在大部分情况下,快速排序综合性能最高;而不管在和情况下,堆排序性能都比较稳定。