一. 题目
1. 题目
调整数组使奇数全部都位于偶数前面。 题目: 输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半部分。
二. 解题思路
1. 思路分析
(1)题目要求奇数在前,偶数在后。采用双下标,left从左开始寻找偶数;right从右开始寻找奇数。
(2)交换left与right对应的数组元素
(3)一直循环,直到left大于等于right时停止循环。
2. 时间复杂度
3. 代码详解
代码语言:javascript复制#include <stdio.h>
void move_arr(int arr[], int sz);
int main() {
int arr[10] = { 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i ) {
scanf("%d", &arr[i]);
}
move_arr(arr, sz);
for (i = 0; i < sz; i ) {
printf("%d ", arr[i]);
}
return 0;
}
void move_arr(int arr[], int sz) {
int left = 0;
int right = sz - 1;
while (left < right) {
//左边找偶数
while (left < right && arr[left] % 2 == 1) {
left ;//奇数便跳过
}
//右边找奇数
while (left < right && arr[right] % 2 == 0) {
right--;//偶数便跳过
}
//交换奇偶数
if (left < right) {
int t = arr[left];
arr[left] = arr[right];
arr[right] = t;
}
}
}
代码语言:javascript复制#include <stdio.h>
int main() {
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i ) {
scanf("%d", &arr[i]);
}
int j = sz - 1;
for (i = 0; i < sz; i ) {
//左边找偶数
if (arr[i] % 2 == 0) {
//右边找奇数
while (arr[j] % 2 == 0 && i < j) {
j--;
}
//交换奇偶数
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
for (i = 0; i < sz; i ) {
printf("%d ", arr[i]);
}
return 0;
}
三. 本题知识与收获
这种方法只进行了一次数组的遍历,不过是前后同时进行的,借助了两个下标