原代碼嘗試使用「雷德算法」(位反轉置換) 實現數組反轉,但邏輯錯誤導致死循環:
while(k<=i) 條件判斷錯誤i 更新邏輯混亂,未正確遍歷數組#include
#include
void reverse(int *dest, const int *src, int n) {
for (int i = 0, j = n - 1; i < n; i++, j--) {
dest[i] = src[j];
}
}
int main() {
int a[] = {1, 2, 3, 4, 5, 6, 7, 8};
int n = sizeof(a) / sizeof(a[0]);
int *b = malloc(n * sizeof(int));
reverse(b, a, n);
for (int i = 0; i < n; i++)
printf("%d ", b[i]);
putchar('\n');
free(b);
return 0;
}
// 輸出: 8 7 6 5 4 3 2 1
void reverse_inplace(int *arr, int n) {
for (int i = 0, j = n - 1; i < j; i++, j--) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
| 算法 | 時間複雜度 | 空間複雜度 | 適用場景 |
|---|---|---|---|
| 雙指針 (新數組) | O(N) | O(N) | 需保留原數組 |
| 雙指針 (原地) | O(N) | O(1) | 通用首選 |
| 位反轉置換 | O(N log N) | O(1) | FFT 等特殊場景 |
結論:數組反轉無需複雜算法,雙指針法簡潔高效,是標準解法。