Skip to main content

排序基础

Overview

在之前学习排序算法的过程中,我们一般会将排序算法分为不同的种类来学习,比如插入类排序、选择类排序等等。但是在实际使用算法时,我们其实并不需要对算法属于哪一个种类关注太多,而更需要关注的是排序的时间复杂度、空间复杂度和排序的稳定性,从而根据业务场景选择适当的算法。本文也将以时间复杂度为纬度,来对常用的算法进行划分,对不同种类的算法进行比较。

稳定排序

原地排序

in place

逆序数

逆序数(inversion): 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数

当一个待排序列完全有序时,逆序数为 0,当完全逆序时,逆序数为n * (n-1) / 2

O(n^2)

适合小规模数据的排序,当数据量较大时便不太实用:

  • 冒泡排序
  • 直接插入排序
  • 选择类排序

O(nlogn)

数据量较大时常用:

  • 快速排序
  • 归并排序
  • 堆排序

O(n)

对初始序列要求非常苛刻,只能适用于极少数的应用场景:

  • 桶排序
  • 基数排序

这两种算法是基于非比较的排序算法,不涉及元素之间的比较操作,所以这两种算法都可以将排序的时间复杂度降到 O(n)。时间复杂度 O(n)的排序算法也叫作线性排序(Linear sort)

Reference

  1. 数据结构与算法之美(11,12,13,14,28), by 王争
  2. 《数据结构高分笔记》