算法

算法

一、算法基础介绍

     1、算法两大要素 ,时间复杂度和空间复杂度,时间复杂度为一个算法耗时。空间复杂度为算法占用资源。

     2、时间复杂度计算方法

         T(n)为时间复杂度,f(n)为所有语句执行n次的函数,O(n)为渐进函数,即划定了T(n)上界

         公式为 T(n) = O(f(n))

         比较:最后的计算上界结果进行比较,数值越大就说明算法越复杂。

                 O(1)<O(log2n)<O(n)<O(nlog2n)<O(n^2)<O(n^3)<…<O(2^n)<O(n!)

                 举例:              

for (i=1;i<n;i++)
    {
        y=y+1;         ①   
        for (j=0;j<=(2*n);j++)    
           x++;        ②      
    }         
解: 语句1的频度是n-1
          语句2的频度是(n-1)*(2n+1)=2n^2-n-1
          f(n)=2n^2-n-1+(n-1)=2n^2-2
          该程序的时间复杂度T(n)=O(n^2).

  难度更大的例子

已知某程序的时间复杂度的递推公式为:T(n)=25T(n/5)+n^2,求T(n)?

对照主定理,题中a=25,b=5,f(n)=n^2,符合第(2)种情况,因此时间复杂度为O(n^2*Log2n)

    3、对于T(n)的趋势

    纵轴为T(n)横轴为n,那么线性介O(n),就是一条斜率一定的直线,对数阶在直线下方,k次方阶在直线上方,说明效率最高的是常数阶O(1),然后就是对数阶。注意常数阶为O(1),线性阶为O(n)。

二、算法

常见排序算法及时间复杂度

冒泡 O(n2)

选择 O(n2)

快速 O(nlog2n)

堆    O(nlog2n)

箱排序 O(n)

 

名称

复杂度

说明

备注

冒泡排序
Bubble Sort

O(N*N)

将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮

 

插入排序

Insertion sort

O(N*N)

逐一取出元素,在已经排序的元素序列中从后向前扫描,放到适当的位置

起初,已经排序的元素序列为空

选择排序

O(N*N)

首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此递归。

 

快速排序

Quick Sort

O(n *log2(n))

先选择中间值,然后把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使用这个过程(递归)。

 

堆排序HeapSort

O(n *log2(n))

利用堆(heaps)这种数据结构来构造的一种排序算法。堆是一个近似完全二叉树结构,并同时满足堆属性:即子节点的键值或索引总是小于(或者大于)它的父节点。

近似完全二叉树

希尔排序

SHELL

O(n1+)

0<£<1

选择一个步长(Step) ,然后按间隔为步长的单元进行排序.递归,步长逐渐变小,直至为1.

 

箱排序
Bin Sort

O(n)

设置若干个箱子,把关键字等于 k 的记录全都装入到第k 个箱子里 ( 分配 ) ,然后按序号依次将各非空的箱子首尾连接起来 ( 收集 ) 。

分配排序的一种:通过" 分配 " 和 " 收集 " 过程来实现排序。

1、冒泡排序

注意:1)可以用(5,2,1)为例子实验。

        2)在内存中始终会有一个动态的列表在记录列表的排序,直至第二个循环结束。才会产生新的列表。然后第一个循环开始循环新的列表。

        3)a,b = b,a 代替排序中的三句交换。

三、利用python的思想解决一些算法问题

    1、求哪些连续元素的和最大

        [1,3,2,-9,23,93,-35,5,8]

     2、排序算法中适合python思想的一些算法

         python思想是一定有一个环境。

         堆排序,希尔排序和箱排序适合python思想。

         整理------------------------------------------------------------------------

posted on 2017-01-17 09:17  lexn  阅读(221)  评论(0编辑  收藏  举报

导航