1

我是一名学生,我在一本书中查找了此功能。它可以正常工作,但我不太了解sortFunction()传递给qsort()函数的内部工作原理。如果有人可以详细解释它,请做。提前致谢。

#include<iostream>
#include<stdlib.h>

using namespace std;

//form of sort function required by qsort()
int sortFunction(const void *intOne,const void *intTwo);

const int tableSize = 10;

int main()
{
    int i, table[tableSize];

    //fill the table with values
    for(i = 0; i < tableSize; i++)
    {
        cout << "Enter value " << (i + 1) << " : ";
        cin >> table[i];
    }
    cout << "\n";

    //sort values
    qsort((void*)table, tableSize, sizeof(table[0]), sortFunction);

    //print the results
    for(i = 0; i < tableSize; i++)
    {
        cout << "Value " << (i + 1) << " : " << table[i] << endl;
    }

    cout << "\nDone\n";

    return 0;
}

int sortFunction(const void *a, const void *b)
{
    int intOne = *((int*)a);
    int intTwo = *((int*)b);

    if (intOne < intTwo)
    {
        return -1;
    }
    if (intOne == intTwo)
    {
        return 0;
    }

    return 1;    
}
4

4 回答 4

4

sortFunction实际上并没有进行排序,它被用作比较函数来确定一个元素是否应该在排序列表中位于另一个元素之前。

于 2010-11-16T02:17:26.257 回答
4

如果您查看对qsort...的实际调用

qsort((void*)table, tableSize, sizeof table[0], sortFunction); 

...你会看到它提供:

  • void*要排序的整个数据数组的地址和大小(以字节为单位),然后
  • 该数组中一个数据元素的大小,然后
  • 指向比较函数“sortFunction”的指针。

没有传递的参数允许qsort知道元素的类型是什么 - 即任何单个数据元素中的各个位如何用于表示某些数据值 - 所以没有办法qsort有意义地比较两个这样的元素。当你供应...

int sortFunction(const void *a, const void *b)   
{   
    int intOne = *((int*)a);   
    int intTwo = *((int*)b);   

...并qsort调用它,您将获得两个指针-它们指向内存地址,但是当qsort调用sortFunction这些void指针时,它们仍然不会告诉您有关数据元素类型的任何信息,因为qsort它本身没有洞察力可以传递。上面的最后两行代码是你——协调qsort调用的程序员——重新应用你一直以来对数据元素类型的知识:在这种情况下,它们是ints,所以你将每个void*转换为int*(使用(int*)a),然后取消引用int*以获取intat 内存地址a。同样对于b在这样做的过程中,您已经恢复了作为 numbers存在的两个数字。然后,工作sortFunction是指示排序完成时应如何排序。表示a应该是第一个,sortFunction可以返回任何负值(例如-1);如果它们是等价的return 0;,并且如果b应该是第一个,则返回任何正值(例如1)。 qsort()接收该信息并使用它来计算如何在数据元素排序时对其进行洗牌。

FWIW,C 可以让您更简洁地表达...

return intOne < intTwo ? -1 :
       intOne == intTwo ? 0 :
       1;

...或(更快,但依赖布尔比较结果为 0 和 1,这可能会使一些阅读您的代码的程序员感到困惑)...

return (intOne > intTwo) - (intOne < intTwo);

...或者,如果您确定以下在数学上永远不会小于INT_MIN(这些值不恰当地环绕为一个大的正数)...

return intOne - intTwo;
于 2010-11-16T05:53:08.777 回答
3

您所谓的“sortFunction”通常称为比较器。它基本上告诉通用排序代码qsort()是否正在排序的数组中的两个元素比较相等(0),或者第一个参数是否在第二个(<0)之前排序或第一个参数在第二个(>0)之后排序。

有了这些信息,加上每行的大小,加上数组中的行数和数组的开头,qsort()函数就可以正确地对数据进行排序。

于 2010-11-16T02:17:37.297 回答
0

正如您在文档中看到的,qsort 函数将比较器作为它的最后一个参数。该函数用于实际比较参数(告诉哪个参数应该在排序数组中排在第一位)。

于 2010-11-16T02:20:33.813 回答