01 插入排序

一、算法

1.1 算法分析

  在设计算法之前,我们需要掌握分析算法的能力。算法分析是理论研究关于计算机性能和资源利用情况。

  算法分析最看重的是性能,看哪种算法能运行的更快。

1.2 什么比性能更重要

  正确性,简洁性,可维护性,开发成本,稳定性或者健壮性,功能性,模块化,安全性,友好的交互性。

1.3 为什么研究算法,提升性能

  1.3.1 算法的性能通常能决定算法的可行性

  1.3.2 算法能描述程序行为,可以成为理解程序的方法

  1.3.3 性能相当于软件界的货币,可以用它来交换衡量软件的其他方面,如安全性,稳定性等等。

二、排序问题

输入:<a1,a2,a3....,an>

输出:<a1‘,a2’,a3‘....,an’>$a1‘<a2’<a3‘....<an’

插入排序C语言实现:

 1 #include <stdio.h>
 2 
 3 
 4 void insertSort(int *nums, int size);
 5 
 6 int main()
 7 {
 8 
 9     int nums[10] = {5,3,7,1,2,6,9,0,8,4};
10 
11     insertSort(nums,10);
12 
13     for(int i = 0; i < 10; i++)
14       printf("%d\n",nums[i]);
15     return 0;
16 }
17 
18 void insertSort(int *nums, int size)
19 {
20     //从第二个元素开始,之前的所有元素都是有序的
21     //将需要插入的key值放在前面有序数组的合适位置
22     //每次循环,前面有序的数组不变,然后每次获得循环
23     for(int i = 1;i < size; i++)
24     {
25         int key = nums[i];
26         int j = i-1;
27 
28         while(j>=0 && nums[j] > key)
29         {
30             nums[j+1] = nums[j];
31             j--;
32         }
33 
34         nums[j+1] = key;
35     }
36 }

2.1 运行时间:

  运行时间依靠很多因素:

  --输入数据的规模。

  --输入数据已有序的程度。

  综上,运行时间是输入规模的函数。我们需要知道的是运行时间的上界(最坏情况),它代表对用户的承诺。

2.2 分析的种类

2.2.1 最坏情况分析(通常我们最关心这种)

  T(n)定义为输入规模为n的最长运行时间。

  注:若不是在最坏情况下T(n)与n只是具有相关关系(如还有输入数据的情况),而不是函数关系,当我们需要知道最坏情况,也就是去求一个最大值,这就变成了函数关系。

2.2.2 平均情况分析

  T(n)定义为输入规模为n的所有可能的运行时间的期望。

  运行时间的期望指每种可能的运行时间×这种可能出现的概率。这是一种加权平均。

  而一般这种概率为一个有关输入的统计分布的假设,如等可能的均匀分布。

2.2.3 最好情况分析

  这是一种假象,没什么用。

2.3 插入排序的最坏运行时间:

  首先依靠计算机的性能,而当我们比较算法时我们一般比较的是他们的相对速度。

  渐进分析:忽略掉依赖机器的常量,同时不去关注实际运行时间,而是关注运行时间的增长。

  渐进符号:

    --O():写一个公式忽略掉其中的低阶项,然后去掉前面的常数。

  访问次数:最内层循环中的一个变量被访问了多少次。

  插入算法:O(n2)对于n较小时比较好用。

三、归并排序

mergeSort(A[1...n])

{

1、if n = 1 ,成功;

2 else sort[0,n/2] and sort(n/2,n)

3、将两个排好序的子序列合并。

}

 

posted @ 2013-05-31 14:56  学而知不足  阅读(...)  评论(...编辑  收藏