排序算法浅谈|青训营笔记

168 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记

排序算法是计算机科学中的基本算法,其目的在于将一组乱序的数字排列成有序的数字常来说,一门语言都会内置一些排序算法的函数库,但是我们依旧要了解其原理来解决实际中可能遇到的问题(以升序为例)。本位就从课程中介绍的排序算法入手,复习一下这些排序算法。

1.插入排序

插入排序是所有排序中最容易理解的排序算法,其中心思想是从数组的第一位遍历到数组的最后一位。每次遍历时,在数组当前位和之后的内容里找到最小的一位,并将其与数组当前位交换(这一步也被叫做插入)。重复数次,便得到了一个经过排序的数组,由于其在数组中需要两层的嵌套遍历,所以其时间复杂度为O(n^2)。

2.快速排序

快速排序是理论上来说平均时间复杂度最快的排序算法,其基本思想立于DC (Divide and Conquer 分而治之),也就是将整个数组的排序的问题分成非常多个数组排序的小问题。针对某个普通的数组,我们随机选出数组中的一个元素,并依靠这个元素把数组内的元素分为两类,一类是比这个元素大的元素,另一类是比这个元素小的元素。我们把更小的元素交换至所选元素的左侧,把更大的元素交换至所选元素的右侧,并在之后针对每个数组重复这一过程。由于这个过程的第一个步骤,partition(分区)需要对数组每个元素进行遍历,但所分之后的区域的元素是原区域的对数分之一倍,所以其时间复杂度是O(nlogn)。

(特殊情况下变为O(n^2),如数组是降序)

3.堆排序

堆排序是一种基于这种数据结构的排序算法,其想要了解堆排序就要了解堆的性质,堆有以下两个性质

  • 堆中某个结点的值总是不大于或不小于其父结点的值;
  • 堆总是一棵完全二叉树。 如果一个堆某个结点的值不大于其父节点的值,则说这个堆是小顶堆,反之则是大顶堆。

堆排序的思路

  1. 将数组构建为大顶堆。
  2. 将大顶堆的根节点与末尾的节点交换。
  3. 以末尾节点之前的元素为新数组,构建大顶堆,并重复2,3步,直到末尾节点之前的元素仅有一个。

在这时,数组已经变成升序数组,且由于每次构建大顶堆的步骤复杂度都仅需要log(n),所以其总体时间复杂度为O(nlogn),且最好最坏情况都是O(nlogn),非常稳定。适合在时间复杂度要求敏感且比较平均的业务中使用。

以上就是排序算法的基本介绍了,也是我课上的笔记,希望能够帮到大家哦