学习排序的基本概念和评判标准
学习多种排序算法
利用 python 2.x
语言实现
百度百科:排序算法
排序:对一个序列,按照数字的大小,进行递增或者递减的排列的操作
评判标准包括 稳定性,时间复杂度 和 空间复杂度
稳定性
如果序列中同样大小的元素的相对位置在排序过后仍旧保持不变,则该排序算法是稳定的。
比如,原始序列为 (3,1) (2,2) (3,3) (1,4)
(括号内第一个元素表示值,第二个表示下标)
排序过后有两种可能结果
(1,4) (2,2) (3,1) (3,3)
,则该排序算法是稳定的;(1,4) (2,2) (3,3) (3,1)
,则该排序算法是不稳定的
时间复杂度
百度百科:时间复杂度
时间复杂度指执行算法所需的计算工作量
时间复杂度是一个函数,它定性的描述该算法的运行时间,常用 O
符号表示,它考察当输入大小趋近无穷大时的情况
一般情况下,算法中基本操作重复执行的次数是问题规模 n
的某个函数,用 T(n)
表示,若有某个辅助函数 f(n)
,使得当 n
趋近于无穷大时,T(n)/f(n)
的极限值为不等于零的常数,则称 f(n)
是 T(n)
的同数量级函数。记作 T(n)=O(f(n))
,称 O(f(n))
为算法的渐进时间复杂度,简称时间复杂度。
分析:随着模块 n
的增大,算法执行的时间的增长率和 f(n)
的增长率成正比,所以 f(n)
越小,算法的时间复杂度越低,算法的效率越高。
在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出 T(n)
的同数量级(它的同数量级有以下:1
,logn
,n
,nlogn
,n 的平方
,n 的三次方
,2 的 n 次方
,n!
),找出后,f(n) = 该数量级
,若 T(n)/f(n)
求极限可得到一常数 c
,则时间复杂度 T(n) = O(f(n))
比如函数如下所示:
def test(n):
for i in xrange(n):
for j in xrange(n):
print i*j
for k in xrange(n):
print i*j*k
针对当前函数 test
,基本操作为 print i*j
和 print i*j*k
,T(n) = n^2+n^3
,其同数量级为 n^3
,所以 f(n) = n^3
,该函数的时间复杂度 T(n)=O(n^3)
Note:
- 一重
for
循环,时间复杂度为O(n)
- 二重
for
循环,时间复杂度为O(n^2)
m
重for
循环,时间复杂度度为O(n^m)
- 二分操作的时间复杂度为
O(logn)
- 一个
for
循环嵌套一个二分操作,则时间复杂度为O(nlogn)
空间复杂度
百度百科:空间复杂度
一个算法在计算机存储器上所占用的存储空间包括三个方面:
- 存储算法本身所占用的存储空间
- 算法的输入输出数据所占用的存储空间
- 算法在运行过程中临时占用的存储空间
空间复杂度指算法在运行过程中临时占用存储空间大小的量度,记做 S(n)=O(f(n))
实现排序算法如下:
- 选择排序(
selection sort
) - 插入排序(
insert sort
) - 折半插入排序(
binary insert sort
) - 冒泡排序(
bubble sort
) - 快速排序(
quick sort
) - 归并排序(
merge sort
) - 希尔排序(
shell sort
) - 基数排序(
radix sort
) - 堆排序(
heap sort
)