將陣列調整為「所有奇數在前,偶數在後」,順序不限。
void odd_even_extra(int *arr, int n) {
int *odd = malloc(n * sizeof(int));
int *even = malloc(n * sizeof(int));
int o = 0, e = 0;
for (int i = 0; i < n; i++) {
if (arr[i] & 1) odd[o++] = arr[i];
else even[e++] = arr[i];
}
memcpy(arr, odd, o * sizeof(int));
memcpy(arr + o, even, e * sizeof(int));
free(odd); free(even);
}
void odd_even_inplace(int *arr, int n) {
int left = 0, right = n - 1;
while (left < right) {
while (left < right && (arr[left] & 1)) left++; // 找偶數
while (left < right && !(arr[right] & 1)) right--; // 找奇數
if (left < right) {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++; right--;
}
}
}
// 將偶數像氣泡往右推
for (int i = 0; i < n; i++)
for (int j = 0; j < n - i - 1; j++)
if ((arr[j] & 1) == 0) // arr[j] 是偶數
swap(&arr[j], &arr[j+1]);
| 場景 | 推薦方法 |
|---|---|
| 一般情況、陣列較小 | 雙指針原地 (最優綜合) |
| 需保持穩定順序 | 額外空間法 / 計數排序思想 |
| 嵌入式極度受限記憶體 | 雙指針原地 |
| 教學展示排序思想 | 冒泡法 |