调整数组使奇数全部位于偶数前面

张开发
2026/4/20 5:08:12 15 分钟阅读

分享文章

调整数组使奇数全部位于偶数前面
这是一个经典的数组重排问题。我们可以使用“双指针”法高效地在原数组上完成操作时间复杂度为 O(n)空间复杂度为 O(1)。解题思路双指针法定义两个指针left从数组开头开始right从数组末尾开始。left向右移动直到找到一个偶数。right向左移动直到找到一个奇数。如果此时left right说明我们找到了一个需要交换的“错位”对左边是偶数右边是奇数交换它们。重复上述过程直到left right。这样所有奇数会被“推”到前面所有偶数被“拉”到后面。C语言实现代码#include stdio.h // 函数调整数组使奇数在前偶数在后 void adjustOddEven(int arr[], int n) { int left 0; int right n - 1; while (left right) { // left 向右找第一个偶数 while (left right arr[left] % 2 ! 0) { left; } // right 向左找第一个奇数 while (left right arr[right] % 2 0) { right--; } // 如果还没相遇交换 if (left right) { int temp arr[left]; arr[left] arr[right]; arr[right] temp; left; right--; } } } // 打印数组辅助函数 void printArray(int arr[], int n) { for (int i 0; i n; i) { printf(%d , arr[i]); } printf( ); } // 主函数测试 int main() { int arr[] {1, 2, 3, 4, 5, 6, 7, 8}; int n sizeof(arr) / sizeof(arr[0]); printf(原始数组: ); printArray(arr, n); adjustOddEven(arr, n); printf(调整后数组: ); printArray(arr, n); return 0; }输出示例原始数组: 1 2 3 4 5 6 7 8 调整后数组: 1 7 3 5 4 6 2 8注意题目只要求“奇数在前偶数在后”不要求保持原有相对顺序。如果你需要保持奇数/偶数内部的原始顺序稳定排序则需要用额外空间或更复杂的算法如类似快排的分区但保持稳定。但根据题意“调整顺序使得奇数位于前半部分偶数位于后半部分”通常默认不要求稳定性所以上述双指针解法是标准且高效的。

更多文章