C语言打印柱形图及排序过程演示

我们今天来学习一个把数组元素打印成柱形图的技巧,结果如下:

                005 
            004 ### 
        003 ### ### 
    002 ### ### ### 
001 ### ### ### ### 
jack@alchemy:~/C$ 

思考过程

如果我们把一个数组的每个元素用柱形图的方式打印出来,里面的各个元素是

1, 2, 3, 4, 5

我们有一个平面直角坐标系,那么、坐标系里面的某个点的纵坐标意义就是这个点在某条垂直于y轴的直线上

一图胜千言:

所以,我们可以用一个循环来表示y轴

for (int i = 20; i > 0; --i)

这个东西看起来就像是一个长度只有20个长度的y轴

当我们的数据大于等于这个y轴坐标的时候,我们的柱形图就应该“存在”了。(这里我找不到更好的表述)

下面我们来看

代码

int print_array(int *array, int size)
{
        system("clear");
        for (int i = 20; i > 0; --i) { // 外循环是y轴
                for (int j = 0; j < size; j++) { // 遍历访问每一个数组元素
                        // 如果数组元素大于或者等于当前y轴坐标
                        if (array[j] == i) 
                        {
                                printf("%03d", i);
                        }
                        else if (array[j] > i){
                                printf("###");
                        }
                        else 
                                printf("   ");
                        // 处理完一个元素之后,打印一个空格来隔开。
                        printf(" ");
                }
                putchar('\n');
        }

        return 0;

}

执行结果

                005 
            004 ### 
        003 ### ### 
    002 ### ### ### 
001 ### ### ### ### 
jack@alchemy:~/C$ 

结合排序算法

结合冒泡排序算法

在每一次交换之后,我们进行一次屏幕的清空(windows下面可以用CLS命令, linux下面可以用clear命令),然后再进行数组的打印。

代码

int bubble_print(int *a, int size)
{
        int i = 0, j = 0;
        int changed = 0;
        for (i = 0; i < size-1; ++i) // i表示着倒数第几个位置成为最大(小)值, 
        {
                changed = 0;
                for(j = 0; j < size-i; ++j) // 因为i这个计数是从0开始的,i的最大值小于数据长度-1,j就能走到倒数数据长度-1个位置, 也就是j能走到正数第二个位置
                // 随着i的值的变大,j走的范围在减小
                {
                    if (a[j] > a[j+1]) // 这里我们想要一个升序的结果,如果前面的比后面的大,就交换数据
                    {
                        int tmp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = tmp;
                        changed = 1;

                    }
                        print_array(a, size); // 在这里进行了打印
                        usleep(300000);
                }
                        if (!changed) {
                                break;
                        }

        }
        return 0;

}

效果

请读者自己去尝试一下快排的演示

这里是快排效果

总结

流程控制其实就可以控制很多自然的东西。 编程虽然是数学计算,但不仅仅是数学计算

posted @ 2019-03-16 10:56  不怕旅途多坎坷  阅读(1519)  评论(0编辑  收藏  举报