排序 0 - 前言

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

学习多种排序算法

利用 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值