算法导论一课时记录之算法分析

前言

算法分析是理论研究,是关于计算机程序性能和资源的利用研究,重点在于性能

    对于程序设计来说,比性能更加重要的是正确性,简洁,可维护性,健壮性,但是性能的好坏直接决定可行与不可行,例如对于实时的要求,所以算法总是在最前沿

排序问题

插入排序

    输入一组序列a1,a2直到an,按照要求重新排序之后输出,排序之后每一个数字出现仅出现一次,且a按升序排例,假如我们使用插入排序来完成


INSERTION-SORT(A)

for j=1 to A.length:

key=A[j]

//将A[j]插入已排序序列A[1..j-1]

i=j-1

while i>0 and A[i]>key

A[i+1]= A[i]

i=i-1

A[i+1]=key

STEP1: 声明一个数组A


STEP2:设置外部循环条件从j=2开始递增,内部循环条件i=j-1递减直到i==0,循环的作用在于完成增量,使得每一次排序过后的数组长度+1


STEP3:用没有排序过的数组的第一项依次和已经排序过的数组比较

package com.tan.sort;

/**

*

* @author 谭婧杰

*

*/

public class InsertSort {

public static void main(String[] args) {

int[] A = {5,2,4,6,1,3};

for(int i = 1;i <A.length;i++) {

for(int j = i;j >0;j--) {

if(A[j-1] >A[j]) {

int temp = A[j-1];

A[j-1] = A[j];

A[j] = temp;

}

}

}

}

}

// -> 1 2 3 4 5 6

524613
254613
245613
245163
241563
.....
123456

运行时间

运行时间取决于多种因素

输入本身

  • 最优情况:输入已经有序
  • 最坏情况:输入逆序

运算规模

处理的输入规模越大,运行时间越长,通常处理输入规模的方式是依输入规模将其参数化,运行时间的上界代表着对于用户的承诺

分析

  • 最坏情况分析:T(n)定义为输入规模为n时的最长运行时间
  • 最好情况分析:
  • 平均情况:T(n)定义为输入规模为n时所有可能输入的期望值(加权平均)

渐近分析

    忽略掉依赖机器的常量,不去检查实际运行时间而是关注运行时间的增长

Θ

对于一个公式,丢弃它的低阶项,并忽略它的常数因子


EX:3n^3+90*n^2-8n+567 = Θ(n^3)


    假如我们关注一个n倾向于无穷大时候,就会意识到Θ(n^2)迟早会战胜Θ(n^4),对于小的n来说,插入排序是快的,但是对于一个巨大的n来说,插入排序就显得不那么快了,所以有另一个更快的排序算法归并排序

归并排序

对于数组A[1...n]的归并排序,存在三个基本步骤:

  • STEP1:if n = 1; done

  • STEP2:否则递归对A[1到n/2向上取整]以及A[n/2+1向上取整..n]这部分排序

  • STEP3:排序之后的两个表归并

    归并排序为线性时间的Θ(n)b

以上是 算法导论一课时记录之算法分析 的全部内容, 来源链接: utcz.com/a/24948.html

回到顶部