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、将两个排好序的子序列合并。
}