排序 0

来源:互联网 发布:祛痘产品淘宝 编辑:程序博客网 时间:2024/06/11 21:48

学习排序的基本概念和评判标准

学习多种排序算法

利用 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) 的同数量级(它的同数量级有以下:1lognnnlognn 的平方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*jprint i*j*kT(n) = n^2+n^3,其同数量级为 n^3,所以 f(n) = n^3,该函数的时间复杂度 T(n)=O(n^3)

Note:

  • 一重 for 循环,时间复杂度为 O(n)
  • 二重 for 循环,时间复杂度为 O(n^2)
  • mfor 循环,时间复杂度度为 O(n^m)
  • 二分操作的时间复杂度为 O(logn)
  • 一个 for 循环嵌套一个二分操作,则时间复杂度为 O(nlogn)

空间复杂度

百度百科:空间复杂度

一个算法在计算机存储器上所占用的存储空间包括三个方面:

  • 存储算法本身所占用的存储空间
  • 算法的输入输出数据所占用的存储空间
  • 算法在运行过程中临时占用的存储空间

空间复杂度指算法在运行过程中临时占用存储空间大小的量度,记做 S(n)=O(f(n))


实现排序算法如下:

  1. 选择排序(selection sort
  2. 插入排序(insert sort
  3. 折半插入排序(binary insert sort
  4. 冒泡排序(bubble sort
  5. 快速排序(quick sort
  6. 归并排序(merge sort
  7. 希尔排序(shell sort
  8. 基数排序(radix sort
  9. 堆排序(heap sort