冒泡排序通過兩層嵌套循環,重複比較相鄰元素並交換,將大元素像氣泡一樣“浮”到數組末端。本文採用指針算術訪問數組元素,展示 C 語言底層操作特色。
BubbleSort.c
#include
#include
/* 冒泡排序:升序
* pArr: 數組首地址
* cnt: 元素個數
*/
void bubbleSort(int *pArr, int cnt) {
int i, j, tmp;
for (i = 0; i < cnt; i++) {
for (j = i + 1; j < cnt; j++) {
if (*(pArr + i) > *(pArr + j)) { // 指針算術等價於 pArr[i] > pArr[j]
tmp = *(pArr + i);
*(pArr + i) = *(pArr + j);
*(pArr + j) = tmp;
}
}
}
}
int main(void) {
int cnt;
printf("input array length:\n");
if (scanf("%d", &cnt) != 1 || cnt < 1) {
printf("array length must be larger 0\n");
return 1;
}
printf("array length is %d\n", cnt);
// C99 變長數組 (VLA),或用 malloc 動態分配
int a[cnt];
int i;
for (i = 0; i < cnt; i++) {
printf("input arr[%d] value\n", i);
scanf("%d", &a[i]);
}
bubbleSort(a, cnt);
printf("bubblesort result:\n");
for (i = 0; i < cnt; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
$ gcc -o BubbleSort BubbleSort.c -std=c99 -Wall
$ ./BubbleSort
input array length:
3
array length is 3
input arr[0] value
2
input arr[1] value
1
input arr[2] value
4
bubblesort result:
1 2 4
*(pArr + i) 體現指針與數組下標的等價性。int a[cnt] 簡化了動態內存管理,但棧空間有限,大數組建議 malloc/free。scanf 返回值與 cnt 合法性。cnt - 1 - i(標準冒泡寫法)。動手重寫經典算法是鞏固 C 語言指針、內存、控制流的最佳途徑。堅持練習,必有收穫!