本文目的

本文旨在介绍排序的基础知识和相关概念,为后续章节做铺垫。

排序是什么

排序(sorting)的功能是将一个数据元素的任意序列,重写排列成一个按关键字有序的序列。其确切的定义为:假设有n个数据元素的序列(R1,R2.,。。。,Rn),其相应关键字的序列是(K1,K2,。。。,Kn)。通过排序要求找出下标1,2,。。。,n的一种排列p1,p2,。。。,pn,使得相应关键字满足如下的非递减(或非递增)关系Kp 1<= Kp 2 <=…<= Kp n这样,就得到一个按关键字有序的记录序列:(Rp1,Rp2,。。。,Rpn)

内部排序和外部排序

菜鸟学习笔记排序(学习笔记-排序简单介绍)(1)

整个排序过程在内存储器中进行,称为内部排序。以下介绍的都是内部排序。我们常见的排序都是内部排序

由于待排序元素数量太大,以至于内存储器无法容纳全部数据,排序需要借助外存储设备才能完成,这类排序称为外部排序。

稳定排序和不稳定排序

如果在待排序的序列中存在多个具有相同关键字的元素,假设Ki = Kj(1<=i<=n,1<=j<=n,i != j),若在排序之前的序列中Ri在Rj之前,经过排序后得到的序列中Ri仍然在Rj之前,则称所用的排序方法是稳定的;否则,当相同关键字元素的前后关系在排序中发生变化,则称所用的排序方法是不稳定的。

简单地说,如果A=B,排序前A在B之前,排序结束后A还在B之前,排序就稳定,反之不稳定。

例如:有数据

菜鸟学习笔记排序(学习笔记-排序简单介绍)(2)

原始数据

若排序后得到结果

菜鸟学习笔记排序(学习笔记-排序简单介绍)(3)

稳定排序结果

则称该排序方法是稳定的

若排序后得到结果

菜鸟学习笔记排序(学习笔记-排序简单介绍)(4)

不稳定排序结果

则称该排序方法是不稳定的。

无论是稳定的还是不稳定的排序方法,均能完成排序的功能。在某些场合可能对排序有稳定性的要求,此时就应当选择稳定的排序方法。

比较排序和非比较排序

菜鸟学习笔记排序(学习笔记-排序简单介绍)(5)

大部分排序都是需要通过比较来判断大小,作为排序的依据的。但是也有例外的,比如计数排序、基数排序、不需要进行比较。

插入排序:将无序子序列中的多个记录"插入"到有序序列中,从而增加记录的有序子序列的长度。(详见学习笔记-详解直接插入排序,学习笔记-详解希尔排序)

交换排序:通过"交换"无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列长度。(详见学习笔记-详解冒泡排序,学习笔记-详解快速排序)

选择排序:从记录的无序子序列中"选择"关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。(详见学习笔记-详解简单选择排序,学习笔记-详解堆排序)

归并排序:通过"归并"两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度。(详见学习笔记-详解归并排序)

此外还有基数排序,计数排序。(详见学习笔记-详解基数排序,学习笔记-详解计数排序)

算法复杂度

分为和。其作用: 是指执行算法所需要的计算工作量;而是指执行这个算法所需要的空间。(算法的复杂性体运行该算法时的计算机所需资源的多少上,资源最重要的是时间和空间(即)资源,因此复杂度分为时间和空间复杂度。)一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面。

对于一个算法,其和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。

时间复杂度

在中,时间复杂性,又称时间复杂度,的时间复杂度是一个,它定性描述该算法的运行时间。这是一个代表算法输入值的的长度的函数。时间复杂度常用表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是的,亦即考察输入值大小趋近无穷时的情况。

常见是时间复杂度

常数时间:若对于一个算法,T(n)的上界与输入大小无关,则称其具有常数时间,记作 O(1)时间。如果 T(n) =O(c),其中 c是一个常数,这记法等价于标准记法 T(n) =O(1)

对数时间:若算法的T(n) =O(logn),则称其具有对数时间。由于计算机使用的记数系统,常常以2为底(即log2n,有时写作lgn)。然而,由对数的,logan和logbn只有一个常数因子不同,这个因子在大O记法中被丢弃。因此记作O(logn),而不论对数的底是多少,是对数时间算法的标准记法。

常见的具有对数时间的算法有的相关操作和二分搜索。

线性时间:如果一个算法的时间复杂度为O(n),则称这个算法具有线性时间,或O(n)时间。非正式地说,这意味着对于足够大的输入,运行时间增加的大小与输入成线性关系。

线性对数时间:若一个算法时间复杂度T(n) = O(nlog n),则称这个算法具有线性对数时间。因此,从其表达式我们也可以看到,线性对数时间增长得比线性时间要快,但是对于任何含有n,且n的幂指数大于1的多项式时间来说,线性对数时间却增长得慢。

空间复杂度

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接的空间复杂度是O(1) 。而一般的算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。

常见排序算法

此处不过多赘述,后续将为大家一一介绍。

菜鸟学习笔记排序(学习笔记-排序简单介绍)(6)

本文的初衷为学习笔记的分享,部分图文来源于网络,如侵,联删。

,