c语言入门16,程序员和码农的区别在于这个,算法的介绍
发表于: 2018-11-14 07:51:16 | 已被阅读: 21 | 分类于: C语言
编程语言说到底只是工具,编写代码本质上就是使用工具干活,和建筑工人使用建筑工具干活没什么两样。让编程具有魅力的是
那,什么是算法呢?
按照百度百科的解释,算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。这样的定义非常一本正经,按照我的理解,
每一个计算步骤都要能在有限时间内完成,至于为什么,读者可以自己考虑一下哈。
例如在《》一节中,已知长方形对角两点坐标,计算它的面积时,方法就是:计算长方形的长、宽,再利用公式 面积=长 x 宽。这就是算法。
void sort()
{
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
}
那显然这不叫算法,因为换一个数组这个方法就失效了,没有通用性。真正的数组排序算法,应该能够处理任意一组数据,并且都能输出正确的结果。
不正确的算法,只要其错误率可控,有时候可能是有用的。比如求一个方程的精确解可能开销很大(比如要花费很长时间),但是求误差允许范围内的近似解却很快就能完成,这也是可以接受的。
解决一个问题的方法(算法)绝大多数情况下,都不止一种,合格的程序员应该尽量设计出开销更小的算法。接下来几节,包括本节,我们将介绍几种经典的数组排序查找算法,一起来感受下不同算法的差异。
C 语言数组的插入排序法
对于少量元素的排序,插入排序法是一个有效的算法。插入排序就像我们玩扑克牌一样,拿到一张牌后,我们从右往左(或从左往右)将它与已在手中的每张牌做比较,以此决定它的插入位置。
就像图中拿到一张梅花7,发现它比 10 小,继续往左看,发现它比 5 大,所以把它插在 5 和 10 之间。为什么不继续比较左边的 4 和 2 呢?这是因为之前的牌已经是排好序的。把 7 插入以后,一手牌又是排好序的了,下次接到牌可以继续按照这个方法决定插入位置。
使用 C 语言编程对数组进行插入排序也是一样的道理,只不过数组的两个元素之间不能插入,只能将插入点之后的元素往后移动一个单元。好了,现在思路清晰了,可以写出算法了,请看如下代码:
#include <stdio.h>
int a[5] = { 9, 7, 3, 1, 8 };
void insertion_sort(void)
{
int i = 0, j = 0;
int cur = 0; /** 要比较的值 */
for (j = 1; j < 5; ++j) {
/** 每次排序前,打印出数组元素 */
printf("%d, %d, %d, %d, %d\n", a[0], a[1], a[2], a[3], a[4]);
cur = a[j];
i = j - 1;
/** 将 cur 与它左边的值一一比较 */
while ( (0 <= i)&&(cur<a[i]) ) {
a[i+1] = a[i];
--i;
}
a[i+1] = cur;
}
/** 排序完成后,打印出数组元素 */
printf("%d, %d, %d, %d, %d\n", a[0], a[1], a[2], a[3], a[4]);
}
int main(void)
{
insertion_sort();
return 0;
}
容易看出,使用 C 语言解决这个排序问题时,我们并没有使用多少“技巧”,都是简单的赋值,if 判断以及循环。解决这个问题,