8

c语言入门16,程序员和码农的区别在于这个,算法的介绍

 3 years ago
source link: https://blog.popkx.com/introduction-to-c-language-16-the-difference-between-programmers-and-yards-farmers-is-this/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

c语言入门16,程序员和码农的区别在于这个,算法的介绍

发表于 2018-11-14 07:11:16   |   已被 访问: 479 次   |   分类于:   C语言   |   暂无评论

编程语言说到底只是工具,编写代码本质上就是使用工具干活,和建筑工人使用建筑工具干活没什么两样。让编程具有魅力的是算法,拿到问题,能够设计出解决方案并且完成代码的是程序员,只会按照步骤编码的是码农。git 之父 linus(也是 linux 之父)在谈及 git 时说,git 本身使用的编程技巧不值一谈,他真正感到骄傲的是 git 的设计。

61ca9428def98d0b36a0d040e90e35c5.png

那,什么是算法呢?

按照百度百科的解释,算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。这样的定义非常一本正经,按照我的理解,算法就是解决问题的方法,是将一组输入转化成一组输出的一系列计算步骤,只不过每一个计算步骤都要能在有限时间内完成。

每一个计算步骤都要能在有限时间内完成,至于为什么,读者可以自己考虑一下哈。

例如在《》一节中,已知长方形对角两点坐标,计算它的面积时,方法就是:计算长方形的长、宽,再利用公式 面积=长 x 宽。这就是算法。算法是解决一类问题的,只解决特定问题谈算法没有意义。比如,一个排序算法应该能够对任意一个数组排序,而不是只能对某一个特定数组排序。如果对数组 int a[] = {1,3,4,2}; 排序,写了这样的一个函数:

void sort()
{
    a[0] = 1;
    a[1] = 2;
    a[2] = 3;
    a[3] = 4;
}

那显然这不叫算法,因为换一个数组这个方法就失效了,没有通用性。真正的数组排序算法,应该能够处理任意一组数据,并且都能输出正确的结果。

a64f35ff65031f698ba7558f5356dabb.png

如果对任意一个输入,算法都能在有限的时间内输出正确的结果,则称该算法是正确的。所以算法出错有两种可能,要么是算法会无限的计算下去,要么就是算法输出了错误的结果。

不正确的算法,只要其错误率可控,有时候可能是有用的。比如求一个方程的精确解可能开销很大(比如要花费很长时间),但是求误差允许范围内的近似解却很快就能完成,这也是可以接受的。

解决一个问题的方法(算法)绝大多数情况下,都不止一种,合格的程序员应该尽量设计出开销更小的算法。接下来几节,包括本节,我们将介绍几种经典的数组排序查找算法,一起来感受下不同算法的差异。

C 语言数组的插入排序法

69923ae8a09d18b2dd55034f28cc01df.png

对于少量元素的排序,插入排序法是一个有效的算法。插入排序就像我们玩扑克牌一样,拿到一张牌后,我们从右往左(或从左往右)将它与已在手中的每张牌做比较,以此决定它的插入位置。

就像图中拿到一张梅花7,发现它比 10 小,继续往左看,发现它比 5 大,所以把它插在 5 和 10 之间。为什么不继续比较左边的 4 和 2 呢?这是因为之前的牌已经是排好序的。把 7 插入以后,一手牌又是排好序的了,下次接到牌可以继续按照这个方法决定插入位置。

使用 C 语言编程对数组进行插入排序也是一样的道理,只不过数组的两个元素之间不能插入,只能将插入点之后的元素往后移动一个单元。好了,现在思路清晰了,可以写出算法了,请看如下代码:

a6cd1ef4134fbe94e6d5d027c84c5a39.png
#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;
}
800cc4c3ba76b10bc16a054341f61c4b.png

容易看出,使用 C 语言解决这个排序问题时,我们并没有使用多少“技巧”,都是简单的赋值,if 判断以及循环。解决这个问题,最难的是设计算法,而不是编写代码,算法弄通了,代码很快就写好了。

阅读更多:   C语言


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK