已知数组a[10]=[1,1,5,3,6,1,4,9,7,7],设计c语言算法将其调整为左右两个部分,左边所有元素为奇数,右边所有元素为偶数,要求时间复杂度为O(n),空间复杂度为O(1)。
时间: 2024-10-12 17:15:00 浏览: 19
有一个int数组{1,3,5,-2,4,6},要求获取:最大值、最小值、元素和、平均值
5星 · 资源好评率100%
可以使用双指针法来实现这个需求,算法步骤如下:
1. 初始化两个指针`i`(初始指向数组的第一个元素)和`j`(初始指向数组的最后一个元素)。
2. 当`i`小于`j`时,继续循环:
a. 如果`a[i]`是奇数,将它与`a[j]`交换,并将`i`向右移动一位(`i++`)。
b. 否则,如果`a[i]`是偶数,不做任何操作,直接移动`i`(`i++`)。
c. 继续检查`a[j]`,如果它是偶数,则移动`j`到左(`j--`)。如果是奇数,则保持不变,因为我们需要找到下一个偶数元素。
3. 循环结束后,数组就被分为两部分:从`i+1`到`j`的元素都是偶数,而`i`到`j`之前的元素都是奇数。
以下是对应的C语言代码实现:
```c
#include <stdio.h>
void partition(int arr[], int n) {
int i = 0, j = n - 1;
while (i < j) {
if (arr[i] % 2 != 0) { // 奇数
if (arr[j] % 2 == 0) { // 找到一个偶数放在最右边
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
j--;
} else {
i++; // 还没找到偶数,继续向右找
}
} else {
i++; // 遇到偶数,跳过
}
}
}
int main() {
int a[] = {1, 1, 5, 3, 6, 1, 4, 9, 7, 7};
int n = sizeof(a) / sizeof(a[0]);
partition(a, n);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
return 0;
}
```
阅读全文