对数组进行排序,使得均匀按降序排列,然后按升序排列赔率

时间:2018-03-16 04:29:48

标签: c

我正在尝试对整数数组进行排序,以便以均匀的顺序打印出平均值,然后按升序打印出数组中的奇数。

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]);
}

2 个答案:

答案 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,以便第二个在列表中的第一个之前。
  2. 首先是偶数,第二个是奇数?返回-1,使其首先出现在列表中的第二位。
  3. 奇数?通常比较它们以实现升序(例如,如果相等则返回0,如果第一个小于第二个,则返回-1,如果第二个小于第一个,则1
  4. 甚至?比较它们,但与通常做的降序相反(即,如果相等则返回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