如何将整数数组排序为偶数降序在前、奇数升序在后?
实现偶数降序+奇数升序的数组排序
我来帮你搞定这个特殊的排序需求!你的目标是让数组里的偶数先按降序排列,紧接着奇数按升序排列,比如输入{1,2,3,4,5,6,7,8,9}要输出8 6 4 2 1 3 5 7 9对吧?咱们来修改你现有的代码,核心是重写qsort的比较函数。
原代码的问题
你当前的compare函数只是做了简单的升序比较:return *(int*)p < *(int*)q;,这只能实现整体升序,没法区分奇偶并应用不同的排序规则,所以需要重新设计比较逻辑。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> int compare(const void *p, const void *q); void printArr(int arr[], int n); // Driver program to test sort int main() { int nums[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int size = sizeof(nums) / sizeof(nums[0]); qsort((void*) nums, size, sizeof(nums[0]), compare); printf("Sorted array is\n"); printArr(nums, size); return 0; } // 重写qsort的比较函数,实现偶数降序+奇数升序 int compare(const void *p, const void *q) { int num1 = *(int*)p; int num2 = *(int*)q; // 判断两个数的奇偶性 int isEven1 = (num1 % 2 == 0); int isEven2 = (num2 % 2 == 0); // 情况1:都是偶数,按降序排列 if (isEven1 && isEven2) { return num2 - num1; // 大的偶数排前面,比如8和6,6-8=-2,qsort会把8放前面 } // 情况2:都是奇数,按升序排列 else if (!isEven1 && !isEven2) { return num1 - num2; // 小的奇数排前面,比如1和3,1-3=-2,qsort把1放前面 } // 情况3:一个偶数一个奇数,偶数排前面 else { return isEven1 ? -1 : 1; // 如果num1是偶数,返回-1让它排前面;反之返回1让num2(偶数)排前面 } } // 打印数组的工具函数 void printArr(int arr[], int n) { int i; for (i = 0; i < n; ++i) printf("%d ", arr[i]); }
逻辑解释
咱们拆解一下compare函数的核心逻辑:
- 奇偶判断:先通过
num % 2 == 0判断每个数是不是偶数 - 同偶处理:两个都是偶数时,用
num2 - num1来实现降序——qsort的规则是:返回值为负时,p对应的元素排在q前面;返回正的话则相反。所以大的偶数会被放到前面。 - 同奇处理:两个都是奇数时,用
num1 - num2实现升序,小的奇数会被放到前面。 - 奇偶混合:如果一个是偶数一个是奇数,直接让偶数排在奇数前面——如果
p是偶数就返回-1,否则返回1。
运行这段代码,输入你给的测试数组,就能得到你想要的输出:8 6 4 2 1 3 5 7 9啦!
内容的提问来源于stack exchange,提问作者R. Lee
相关产品推荐
相关产品推荐

