目录
问题描述如下:
move函数的具体实现:
main函数
运行效果
代码(注意看注释):
问题描述如下:
给定一个整数数组,要求将其中的奇数元素全部移动到前面,偶数元素全部移动到后面,但不要求奇数和偶数内部的具体顺序。
move
函数的具体实现:
void move(int* p, int sz) {// 验证输入指针有效性assert(p);int left = 0; // 初始化左下标为0int right = sz - 1; // 初始化右下标为数组长度减1// 当左下标小于右下标时,循环执行交换操作while (left < right) {// 从前往后查找第一个偶数元素while ((left < right) && (p[left] % 2 == 1)) {left++;}// 从后往前查找第一个奇数元素while ((left < right) && (p[right] % 2 == 0)) {right--;}// 如果左下标仍然小于右下标,说明找到可交换的一对奇偶数if (left < right){// 交换这两个元素int tmp = p[left];p[left] = p[right];p[right] = tmp;}}
}
我们关注move
函数的核心逻辑部分:
// 从前往后查找第一个非奇数(即偶数)元素
while ((left < right) && (p[left] % 2 == 1))
{left++;
}
但实际上代码是准确无误的。该段代码的作用是从数组的起始位置(左下标left
处)开始,向右遍历查找第一个偶数元素。这是因为我们的目标是在保持奇数在前的前提下,找到数组中首个“非奇数”位置。初始状态下,由于数组的左侧可能是连续的奇数,所以需要先越过这些奇数,找到第一个偶数。
接下来是右侧指针的操作:
// 从后往前查找第一个奇数元素
while ((left < right) && (p[right] % 2 == 0))
{right--;
}
这段代码则是从数组的末尾(右下标right
处)开始,向左遍历以寻找第一个奇数元素。这样,当左右指针分别定位到一个奇数和一个偶数时,就可以执行交换操作:
if (left < right)
{// 交换这两个元素int tmp = p[left];p[left] = p[right];p[right] = tmp;
}
通过这种方式,每次循环都会确保一对奇偶数被成功地进行交换,直到所有奇数都被移动到数组的前面为止。
main函数
在main
函数中创建了一个包含8个元素的数组arr
,并调用move
函数对其进行处理,之后调用print_t
函数输出处理后的数组内容,以验证move
函数的效果。
int main() {int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};int sz = sizeof(arr) / sizeof(arr[0]);// 调用move函数实现奇偶数交换move(arr, sz);// 打印交换后的数组print_t(arr, sz);return 0;
}
运行效果
代码(注意看注释):
// move函数用于将数组中的奇数移到前面,偶数移到后面
void move(int* p, int sz) {assert(p); // 验证输入指针有效性int left = 0; // 初始化左下标为0int right = sz - 1; // 初始化右下标为数组长度减1// 主循环:当左下标小于右下标时持续执行交换操作while (left < right) {// 从前往后查找第一个非奇数(即偶数)元素// 这里的目的是找到奇数区域的边界,越过连续的奇数while ((left < right) && (p[left] % 2 == 1)) {left++;}// 从后往前查找第一个奇数元素// 这里是找到偶数区域的边界,以便与左侧找到的偶数进行交换while ((left < right) && (p[right] % 2 == 0)){right--;}// 如果左下标仍然小于右下标,则找到了一对可交换的奇偶数if (left < right){// 交换这两个元素int tmp = p[left];p[left] = p[right];p[right] = tmp;}}
}// 辅助函数,用于打印数组元素
void print_t(int* p, int sz){for (int i = 0; i < sz; i++){printf("%d ", p[i]);}
}// 主程序入口
int main() {int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};int sz = sizeof(arr) / sizeof(arr[0]);// 调用move函数对数组arr进行奇偶数交换move(arr, sz);// 打印交换后的数组元素print_t(arr, sz);return 0;
}