【问题标题】:How to use the sort function in C programmingC语言中排序函数的使用方法
【发布时间】:2021-06-08 22:44:37
【问题描述】:

大家好,我这里有一个情况,我想用 C 语言对数字进行排序,但我似乎很难放置一个排序函数,你能帮我用下面的源代码打印出数字并假设对它们进行排序,但我不能...请帮助:

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

int main()
{
    int num1 = 8, num2 = 6, num3 = 2, num4 = 4, num5 = 1;
    printf("%d %d %d %d %d", num1, num2, num3, num4, num5);
    // qsort();  THIS IS WHAT I STRUGGLE WITH AT THE MOMENT
    return 0;
}  // THIS CODE PRINTS OUT NUMBERS BUT ARE NOT SORTED...SO I NEED TO SORT THEM PLEASE
   // YOUR HELP WILL BE MUCH APPRECIATED
   // I NEED TO KNOW HOW TO USE THE SORT(qsort) FUNCTION

【问题讨论】:

  • 您好,欢迎来到 StackOverflow!您是否阅读了qsort 的文档?
  • 最大的问题,qsort 在阵列上工作。五个命名变量不是数组。
  • 花点时间学习编写qsort()compare()函数。这并不难,参数只是指向要排序的数组元素的指针。一旦你花时间与compare() 交朋友,使用qsort() 对任何数组进行排序是非常简单的。只需qsort (array, nelements, elemsize, compare);(完成...)Using qsort and strcmp prior to my sctrucs going into txt files 的答案扩展了如何编写比较函数。
  • qsort() 函数的文档可在许多地方找到。仅搜索函数名称将在结果顶部出现几个适当的匹配项。你看不懂的文档是什么?

标签: c


【解决方案1】:

qsort() 做了一件事,而且做得非常好,它对数组进行排序,而且效率很高。如 cmets 中所述,在使用 qsort() 之前,您需要将值收集到数组中,而不是单独的变量中。一旦你有了一个数组,使用qsort() 是微不足道的,你使用qsort 的唯一职责就是编写compare() 函数。

qsort() 的新用户看到函数声明时通常会翻白眼:

int compare (const void *a, const void *b) { ... }

其实很简单。 ab 只是指向要比较的数组元素的指针。由于qsort() 可以处理任何类型的数组,所以参数类型是void 指针。如果您有一个 int 数组,ab 只是指针 int(例如 int*)。您只需编写比较函数,将ab 转换为int* 并取消引用以相互比较int 值。

compare() 的返回值要么小于零a 排在b 之前),ab 相等) 或大于零b 排在a 之前)。所以一个 naive compare() 可以很简单:

int compare (const void *a, const void *b)
{
    int x = *(int *)a,
        y = *(int *)b;
    
    return x - y;
}

但是,x - y 总是有可能溢出大的负数 x 和大的 y 或大的 x 和大的负数 y。因此,您通常会尝试使用两次比较之间的差异来消除溢出的可能性,例如

int compare (const void *a, const void *b)
{
    int x = *(int *)a,
        y = *(int *)b;
    
    return (x > y) - (x < y);
}

现在,如果您采用ab 的任何值,则返回将是-101,为qsort() 提供排序信息,而不会溢出。

一个使用你的值的简短例子可以写成:

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

int compare (const void *a, const void *b)
{
    int x = *(int *)a,
        y = *(int *)b;
    
    return (x > y) - (x < y);
}

void prn_arr (int *arr, size_t nmemb)
{
    for (size_t i = 0; i < nmemb; i++)
        printf (i ? ", %d" : "%d", arr[i]);
    
    putchar ('\n');
}

int main()
{
    int num[] = {8, 6, 2, 4, 1};
    size_t nmemb = sizeof num / sizeof *num;
    
    puts ("array before sort:\n");
    prn_arr (num, nmemb);
    
    qsort (num, nmemb, sizeof *num, compare);
    
    puts ("\narray after sort:\n");
    prn_arr (num, nmemb);
}

使用/输出示例

$ ./bin/qsortnum
array before sort:

8, 6, 2, 4, 1

array after sort:

1, 2, 4, 6, 8

检查一下,如果您还有其他问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2013-01-23
    • 1970-01-01
    • 2020-02-28
    • 2019-05-01
    相关资源
    最近更新 更多