Tag: qsort

转换函数指针

我正在编写一个函数,它接收一个指向比较函数和MyStructs数组的MyStructs ,并且应该根据比较函数对数组进行排序: void myStructSort( struct MyStruct *arr, int size, int (*comp)(const struct MyStruct *, const struct MyStruct *)) { qsort(arr, size, sizeof(struct MyStruct), comp); } 不幸的是,这不能编译,因为qsort期望比较器接收void *参数而不是const struct MyStruct * 。 我想到了几个不好的解决方案,并想知道正确的解决方案是什么。 选项1 将comp为int (*)(const void *, const void*) 。 这编译但是未定义的行为(请参阅此SO问题 )。 选项2 创建一个全局变量int (*global_comp)(const struct MyStruct *, const struct MyStruct *)并在myStructSort设置global_comp=comp 。 然后创建一个函数: int […]

部分排序数组C.

我有一个看起来像这样的数组: int array[] = {4.53, 3.65, 7.43, 9.54, 0.72, 0.0} 我只是想知道我可以使用什么方法来对这个数组进行部分排序,以便将前三个最大的双打带到前面。 我正在寻找最有效的方法来获得这个数组中前三个最高的数字。 到目前为止,我一直在使用qsort ,但我只是在寻找另一种方法来做到这一点,甚至更快。 我知道qsort在最好的情况下是O(nlogn) ,在最坏的情况下是O(n^2) ,但有没有更有效的方法来实现这个问题? 高效的意思是比O(nlogn)更好的方法。 任何帮助都会很棒

如何比较长双打与qsort和NaN?

如何比较长双打与qsort()和关于非数字 ? 在排序可能包含非数字的数组时,我想将所有这些NAN放在已排序数组的一端。 qsort()对比较函数施加了一些限制。 如果第一个参数被认为分别小于,等于或大于第二个参数,则该函数应返回小于,等于或大于零的整数。 C11dr§7.22.5.23 当相同的对象…不止一次传递给比较函数时,结果应该彼此一致。 也就是说,对于qsort它们应该在数组上定义一个总排序 ,…同一个对象应始终以相同的方式与密钥进行比较。 §7.22.54 当a <= b或a不是a数或b不是a数时, a > b为假。 所以a > b与!(a <= b)因为如果其中一个是NaN,它们会产生相反的结果。 如果compare函数使用return (a > b) – (a < b); 如果a或b中的一个或两个是NaN,则代码将返回0。 数组不会按照需要排序,它会丢失总排序要求。 当使用像int isnan(real-floating x);这样的分类函数时,这种long double方面很重要int isnan(real-floating x); 或int isfinite(real-floating x); 。 我知道isfinite( finite_long_double_more_than_DBL_MAX)可能会返回false。 所以我担心isnan(some_long_double)可能会做出意想不到的事情 。 我试过以下。 它显然按要求排序。 子问题:下面的compare()是否足以按要求排序? 任何建议的简化? 如果没有 – 如何解决? (对于此任务,0.0L和-0.0L之类的值可以以任何方式排序) #include #include […]

快速排序示例中的错误(K&R C书)?

这个快速排序应该将“v [left] … v [right]排序为增加顺序”; K&R(第二版)从C编程语言中复制(不带注释): void qsort(int v[], int left, int right) { int i, last; void swap(int v[], int i, int j); if (left >= right) return; swap(v, left, (left + right) / 2); last = left; for (i = left+1; i <= right; i++) if (v[i] < v[left]) swap(v, ++last, i); swap(v, […]

如何qsort使用结构的指针数组?

我想按Id的顺序排列一系列指针。 但是由于我缺乏指针经验,qsort无法工作。 typedef struct block{ int Id; char * name; } block; typedef struct { block ** data; int size_array; } database; if( ( database = malloc(sizeof(database)) ) == NULL ) { printf(“Error: malloc failed\n”); exit(EXIT_FAILURE); } if( ( database->data = malloc( sizeof( block * ) * database->size_array ) ) == NULL ) { exit(EXIT_FAILURE); […]

解释qsort库中使用的函数的typedef

我正在使用qsort库函数对结构元素数组进行排序,而在Internet上搜索时我找到了一个资源: INFO:使用C qsort()函数 @support.microsoft 对结构进行排序 。 我知道qsort函数需要通用指针进行类型转换。 但是我无法得到这一行: typedef int (*compfn) (const void*, const void*); 已经宣布的,以及随后的电话: qsort((void *) &array, // Beginning address of array 10, // Number of elements in array sizeof(struct animal), // Size of each element (compfn)compare // Pointer to compare function ); typedef是如何表现的,我的意思是我们究竟有什么类型的intdeffed int (*compfn)或int (compfn) ? 如果是前者,那么不应该调用(*compfn) ?

qsortfunction比较困惑我

我看到很多人在qsort比较器函数中使用减法。 我认为这是错误的,因为在处理这些数字时: int nums[]={-2147483648,1,2,3}; INT_MIN = -2147483648; int nums[]={-2147483648,1,2,3}; INT_MIN = -2147483648; int compare (const void * a, const void * b) { return ( *(int*)a – *(int*)b ); } 我写了这个函数来测试: #include #include int compare (const void * a, const void * b) { return ( *(int*)a – *(int*)b ); } int main(void) { int […]

如何从stdlib为qsort编写比较函数?

我有一个结构: struct pkt_ { double x; double y; double alfa; double r_kw; }; typedef struct pkt_ pkt; 这些结构的表格: pkt *tab_pkt; tab_pkt = malloc(ilosc_pkt * sizeof(pkt)); 我想要做的是通过tab_pkt.alfa和tab_pkt.r对tab_pkt进行排序: qsort(tab_pkt, ilosc_pkt, sizeof(pkt), porownaj); porownaj是比较函数,但如何写呢? 这是我的“草图”: int porownaj(const void *pkt_a, const void *pkt_b) { if (pkt_a.alfa > pkt_b.alfa && pkt_a.r_kw > pkt_b.r_kw) return 1; if (pkt_a.alfa == pkt_b.alfa && […]

使用qsort同时对两个数组进行排序?

我可以对单词指针数组进行排序,使它们按字母顺序排序,问题是我需要对整数数组进行排序(使用特定单词的次数),以便整数与它们的位置相同各自的话: 我的代码: for (i = 0; i < numWords; i++) { // prints out the words and their frequency respectively printf("%s – %d\n", dictionary[i], frequency[i]); } //sorts the dictionary so that the words are 'alphabetical' qsort(dictionary, numWords, sizeof(char *), rstrcmp); printf("\nafter qsort\n"); //checkmark for (i = 0; i < numWords; i++) { // prints the […]

在C中使用qsort作为字符数组

我正在尝试使用qsort对字符数组进行排序。 我不明白为什么这不起作用。 我有一个指向比较函数的指针,如man页指定的那样。 有人可以告诉我有什么问题吗? 谢谢。 我的代码: #include #include #include int cmpfunc( const void *a, const void *b) { return *(int*)a – *(int*)b; } void AlphabetSoup( char str[] ) { qsort(str, (size_t) strlen(str), (size_t) sizeof(char), cmpfunc); printf(“%s\n”, str); } int main() { char str1[] = “bcead”; AlphabetSoup(str1); return 0; } 输出:当我期待abcde时的dabce 。