qsort():仅排序数组的偶数

时间:2016-12-04 22:27:31

标签: c sorting

我试图使用qsort()函数来排序数组的偶数(赔率保持在他们的位置)。

例如,如果我有数组:

5 122 3 26 48

排序之后会得到:

5 26 3 48 122

我的直觉只是在ab指向的数字都是偶数时进行排序。

这是我的尝试:

#include <stdio.h>
#include <stdlib.h>

int comp_even(const void *a, const void *b) {
    int l = *(int *)a;
    int r = *(int *)b;

    if ( !(l&1) && !(r&1) ) //if both are even, then sort them in ascending order
        return (l-r);

    return 0;
}

int main() {
    int i, n;
    int a[1001];

    scanf("%d", &n);

    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    qsort(a, n, sizeof(int), comp_even);

    for (i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:3)

不幸的是,qsort并不支持这样的事情;对于任何两个元素,比较函数必须返回三个结果之一:

  • 一个负整数,意味着它的第一个参数应该在之前结束;
  • 一个正整数,意味着它的第一个参数应该在之后结束;
  • 零,意味着任何一个排序都很好(在这种情况下qsort不保证哪个元素在另一个元素之前结束)。

而且,至关重要的是,该函数必须仅使用其两个参数的值来执行此操作;它不知道它们来自的数组索引。

相反,您可以采用以下两种方法之一:

  • 将所有偶数元素复制到一个数组中,使用简单的比较函数对该数组进行排序,然后将该数组的元素复制回原始数组中的偶数元素。
  • 创建一个int[][2],它不仅存储数组中的值,还存储其原始索引。然后,您可以对元素进行排序,使得如果任一值为奇数,则具有较小原始索引的元素首先出现。