我正在尝试对整数数组进行排序,以便以均匀的顺序打印出平均值,然后按升序打印出数组中的奇数。
So the output would look like:
8 6 4 2 1 3 5 7 9
我将如何做到这一点?
#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;
}
//This function is used in qsort to decide the relative order of elements at addresses p and q
int compare(const void *p, const void *q)
{
return ( *(int*)p < *(int*)q);
}
//A utility function to print an array
void printArr(int arr[], int n)
{
int i;
for (i = 0; i < n; ++i)
printf("%d ", arr[i]);
}
答案 0 :(得分:2)
因为它是你的比较功能与qsort正在寻找的不匹配。规则如下(假设第一个输入为p
,第二个输入为q
):
-1
表示p应该在q 0
表示他们是平等的1
表示q应该在p 话虽这么说,允许你做这项工作的关键是改变你的比较函数,以不同的方式处理偶数/奇数。更具体地说,你需要检查第一个是偶数,第二个是奇数,第一个是奇数秒是偶数,偶数,还是两个都是奇数,并且相应地采取行动。
这是设置(请记住,模数很昂贵,所以这不是最有效的):
int first = *(int *)p;
int second = *(int *)q;
int firstIsOdd = first % 2; // Returns 1 if odd, 0 if even
int secondIsOdd = second % 2;
现在您知道哪一个是偶数,哪一个是奇数,您可以用不同的方式处理每个案例。以下是规则:
1
,以便第二个在列表中的第一个之前。-1
,使其首先出现在列表中的第二位。0
,如果第一个小于第二个,则返回-1
,如果第二个小于第一个,则1
0
,如果第二个小于第一个则返回-1
,如果第一个小于1
比第二个)答案 1 :(得分:1)
在比较功能中,测试p和q是否为偶数。偶数和奇数有四种可能的组合{ee,eo,oe,oo}。例如,如果它们都是偶数,可以通过一种方式比较它们,例如返回p>q
您拥有的((int*)p < *(int*)q)
加上,在这种情况下,false必须为负数。如果p是偶数,那么p较小,如果p是奇数而q是偶数,则p更大。如果他们都是奇怪的,那么比较另一种方式,例如p<q
。