如:學生編號數組,判斷某學號是否存在,返回下標或失敗標誌。C 標準庫無內置查詢函數,需自行實現。
#include <stdio.h>
#include <stdlib.h>
int main() {
int nums[10] = {1, 10, 6, 296, 177, 23, 0, 100, 34, 999};
int num, subscript = -1; // -1 表示未找到
printf("Please input an integer: ");
scanf("%d", &num);
for (int i = 0; i < 10; i++) {
if (nums[i] == num) {
subscript = i;
break; // 找到即退出
}
}
if (subscript < 0)
printf("%d isn't in the array.\n", num);
else
printf("%d is in the array, and its subscript is %d.\n", num, subscript);
return 0;
}
Please input an integer: 100 100 is in the array, and its subscript is 7. Please input an integer: 28 28 isn't in the array.
subscript 初始化為 -1(負數),因下標非負break,避免繼續無效比較升序數組 {0, 1, 6, 10, 23, 34, 100, 177, 296, 999}:
for (int i = 0; i < 10; i++) {
if (nums[i] >= num) { // 關鍵:>= 而非 ==
if (nums[i] == num) // 相等 → 找到
subscript = i;
break; // 否則 num < nums[i],後續更大,不可能存在
}
}
nums[i] >= num 兩種含義:
==:找到目標,記錄下標>:當前元素已大於目標,因有序,後續全大於目標 → 不存在break,平均比較次數減半有序數組的最優查找算法,詳見《C語言二分查找(折半查找)算法及代碼》。核心思想:每次排除一半區間。
| 方法 | 前提 | 時間複雜度 | 代碼複雜度 | 適用場景 |
|---|---|---|---|---|
| 線性查找 | 無 | O(n) | 極簡 | 無序、小數據、單次查詢 |
| 優化線性查找 | 有序 | O(n) | 簡單 | 有序、小數據、單次查詢 |
| 二分查找 | 有序 | O(log n) | 中等 | 有序、大數據、多次查詢 |
| 雜湊表 | 可預處理 | O(1) 平均 | 複雜 | 超大數據、高頻查詢 |