我們今天來學習一個把數組元素打印成柱形圖的技巧,結果如下:
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;
}
效果
請讀者自己去嘗試一下快排的演示
這里是快排效果
總結
流程控制其實就可以控制很多自然的東西。 編程雖然是數學計算,但不僅僅是數學計算