如何使用C语言实现一个函数,将一串数字按照从小到大排序,同时满足偶数在前、奇数在后的顺序?
时间: 2024-09-29 12:06:08 浏览: 34
在C语言中,你可以使用经典的分而治之策略,结合选择排序,来实现这个功能。首先创建两个指针,一个指向数组的开始,另一个指向结束,然后分别处理奇数和偶数部分。这里是一个简单的示例:
```c
#include <stdio.h>
// 分别存储偶数和奇数
void separate_numbers(int arr[], int size) {
int i = 0, j = size - 1;
while (i < j) {
// 找到第一个偶数并交换到偶数区
while (arr[i] % 2 != 0 && i < j)
i++;
// 找到第一个奇数并交换到奇数区
while (arr[j] % 2 == 0 && i < j)
j--;
if (i < j) { // 如果两者还没有相遇
int temp = arr[i];
arr[i] = arr[j]; // 交换
arr[j] = temp;
}
}
}
// 冒泡排序奇偶数部分
void bubble_sort_even_odd(int arr[], int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
// 对偶数区冒泡排序
if (arr[j] % 2 == 0 && arr[j + 1] % 2 == 0 && arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
// 对奇数区冒泡排序
else if (arr[j] % 2 != 0 && arr[j + 1] % 2 != 0 && arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 主函数测试
int main() {
int numbers[] = {9, 5, 7, 4, 6, 1, 8, 3};
int size = sizeof(numbers) / sizeof(numbers[0]);
printf("Original array: ");
for (int i = 0; i < size; i++)
printf("%d ", numbers[i]);
separate_numbers(numbers, size);
bubble_sort_even_odd(numbers, size);
printf("\nSorted array (even then odd): ");
for (int i = 0; i < size; i++)
printf("%d ", numbers[i]);
return 0;
}
```
这个程序首先通过`separate_numbers`函数把奇数和偶数分开,然后对每部分独立地进行冒泡排序。注意,这种方法效率不是很高,因为冒泡排序的时间复杂度为O(n^2),但对于小规模数据,它足够简单易懂。
阅读全文