10、数据结构与算法 - 基础:排序算法概述

1、 排序算法介绍

排序也叫做排序算法(Sort Algorithm),将一组数据,按照其中某个或者某些关键字的大小,按照指定的顺序进行排列的操作

排序算法就是如何使记录按照要求排列的方法,通过特定的算法因式,将一组或多组数据按照既定模式重新排序。这种新序列排序遵循一定的规则,体现一定的规律,处理后的数据更利于计算和筛选,提高了计算效率。

2、 排序的分类:

1、 内部排序:将需要处理的所有数据都加载到内部存储器中进行排序;

  • 插入排序:基于某序列已有序排列的情况,一次插入一个元素的方式按照原有排序方式增加元素。从有序序列末端开始执行,插入元素和最大元素比较,找到应该插入的位置

    • 直接插入排序
    • 折半插入排序
    • 希尔排序
  • 选择排序:为每个位置选择当前最小的元素。从第一个位置开始对全部元素进行选择,选出全部元素中最小的给该位置,再重复进行最小元素的选择

    • 简单选择排序
    • 堆排序
  • 交换排序

    • 冒泡排序:把较小的元素往前或者把较大的元素向后调。比较相邻元素,根据比较结果和算法规则对该二元素位置进行交换。
    • 快速排序:通过一趟排序算法把需要排序的元素分割为两大块,一部分的元素小于或等于另外一部分的序列元素,划分后的两块序列的元素分别再实行快速排序算法
  • 归并排序:把序列递归划分成一个个短序列,只有一个元素的直接序列或者只有 2 个元素的序列作为短序列的递归出口,再将全部有序的短序列按照一定的规则进行排序为长序列。

  • 基数排序 2、 外部排序:数据量过大,无法全部加载到内存中,需要使用外部存储进行排序;

3、算法的评价标准

计算算法执行时间的方法:

1、 事后统计;

需要实际运行该程序,得到的时间的统计量依赖于环境因素,需要在同一台计算机的相同状态下运行,才可以比较哪个算法速度更快 2、 事前估算;

通过分析某个算法的时间复杂度来判断哪个算法更优

3.1 时间复杂度

时间复杂度介绍

时间复杂度是一个函数,定性描述算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度通常用大写 O 符号来表示,不包括这个函数的低阶项和首项系数。

一般情况下,算法中的基本操作语句的重复执行次数是问题规模 n 的某个函数,使用 T(n) 表示,如果有某个辅助函数 f(n),使当 n 趋于无穷大时,T(n)/f(n) 的极限值为不等于 0 的常数,则称 f(n) 是 T(n) 的同量级函数。记作 T(n) = O(f(n)),称 O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度

时间频度

一个算法花费的时间与算法中语句的执行次数成正比,执行次数多花费时间就多。一个算法中语句执行次数称为语句频度或者时间频度 T(n)

计算时间复杂度的方法:

  • 使用常数 1 代替运行时间中的所有加法常数
  • 修改后的运行次数函数中,只保留最高阶项
  • 去除最高阶项的系数

常见的时间复杂度

1、 常数阶O(1);

对于一个算法,T(n) 的上界与输入大小无关,则称其具有常数时间,记作 O(1) 时间。 2、 对数阶O(㏒2n);

㏒a n 和 ㏒b n 只有一个常数因子不同,这个因子在在大 O 记法中被丢弃,因此记作 O(㏒n),不论对数的底是多少,是对数时间算法的标准记法。

常见的对数时间的算法有二叉树的相关操作和二分搜索 3、 线性阶O(n);

对于足够大的输入,运行时间增加的大小与输入成线性关系。 4、 线性对数阶O(n㏒2n);

线性对数比线性时间要快,但是对于任何含有 n,并且 n 的幂指数大于 1 的多项式时间来说,线性对数时间却增长很慢 5、 平方阶O(n^2);
6、 立方阶O(n^3);
7、 k次方阶O(n^k);
8、 指数阶O(2^n);

常见时间复杂度由小到大依次为:O(1) < O( ㏒2 n) < O(n) < O(n㏒2 n) < O(n^2) < O(n^3) < O(n^k) < O(2^n),随着问题规模 n 的不断增大,时间复杂度不断增大,算法的执行效率越低。

平均时间复杂度和最坏时间复杂度

1、 平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间;
2、 最坏情况下的时间复杂度称为最坏时间复杂度一般说时间复杂度是最坏情况下的时间复杂度;
3、 平均时间复杂度和最坏时间复杂度是否一致和算法有关;

3.2 空间复杂度

基本介绍

  • 算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间
  • 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,记作 S(n) = O(f(n))
  • 分析算法主要讨论时间复杂度,一些缓存产品(Redis,Memcache)和算法(基数排序)使用空间换时间

量度

一个算法的空间复杂度 S(n) 定义为该算法所耗费的存储空间,也是问题规模 n 的函数,渐进空间复杂度也简称为空间复杂度。空间复杂度(SpaceComplexity)是对一个算法在运行过程中临时占用存储空间大小的量度。

一个算法在计算机存储器上占用的存储空间,包括存储算法本身占用的存储空间,算法的输入输出数据锁占用的存储空间和算法在运行过程中临时占用的存储空间三个方面。

分析

一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。

如果一个算法是递归算法,空间复杂度为递归所使用的堆栈空间的大小,它大于等于一次调用所分配的临时存储空间的大小乘以被调用的次数(递归调用次数加 1,这个 1 表示开始进行的一次非递归调用)

3.3 稳定性

稳定的算法在排序过程中不会改变元素彼此位置的相对次序,反之不稳定的排序算法经常会改变这个次序。稳定性算法中非常重要的影响选择的因素