什么是算法
针对算法的定义从不同的领域和角度出发都会得到有差异的结果。
这里针对算法的几个性质列出说明:
1.确定性:无歧义,照方抓药。
2.可行性:这药要能吃,虽然吃了未必见效。当然吃药是期望见效的。
3.有限性:多久能见效呢?当然这药不能吃一辈子才见效或者还不见效。越快见效越好。
算法的表示
- 自然语言表示:步骤清晰,符合人之常识。例如:一道菜的菜谱就如同一个算法,每个步骤的操作白纸黑字,对于做饭的人来说易于理解。
- 伪代码表示法:毕竟不是厨师啊,有时候少放0.05克的盐影响不大,但是计算机科学是极其严谨的学科,输入极小的误差可能会造成结果的千差万别,伪代码表示法简单严谨,比代码简单,比自然语言严谨。如下示例归并排序的伪代码:
MERGE-SORT A[1…n]
1.如果n等于1结束排序。
2.递归对子序列A[1,n/2]和A[n/2+1,n]进行排序。
3.合并两个子序列排序的结果。
算法的灵魂
衡量一个算法的优劣有很多标准,比如准确性、健壮性、可维护性、可拓展性、安全性、用户友好性等等,这些性质并不是算法的灵魂,算法的灵魂只有一个:速度。
举例分析插入排序的效率
void insert_sort(int *A,int n)//A是待排序的数组,n是数组长度
{
for(int i=2;i<n;i++){
int key = A[i];
int j = i-1;
whlie(j>=0&&A[j]>key){
A[j+1] = A[j];
j--;
}
A[j+1] = key;
}
}
通常衡量一个算法的执行效率通过量化效率为执行过程的循环次数,本段代码首先是一个for循环嵌套一个while循环,外侧的for循环的执行次数是n-1次,内层while最大执行次数是i次,所以整个算法的执行效率是O(n^2).