使用qsort()函数

时间:2010-11-16 02:13:53

标签: c++ function pointers qsort

我是学生&我在一本书中查找了这个功能。它可以正常工作,但我不太了解传递给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;    
}

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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指针仍然告诉你没有关于数据元素 type ,因为qsort没有任何洞察力可以传递。上面的最后两行代码是你 - 协调qsort调用的程序员 - 重新应用你一直以来关于数据元素类型的知识:在这种情况下,它们是{{1} } s,所以你将每个int转换为void*(使用int*),然后取消引用(int*)a以获取int*的内存地址{{1 }}。同样适用于int。在这样做的过程中,您已经恢复了作为数字的两个数字。然后,a的工作是指示在排序完成时应该如何订购它们。为了表明b应该是第一个,sortFunction可以返回任何负值(例如a);如果它们相同,sortFunction,如果-1应该是第一个,则返回任何正值(例如return 0;)。 b接收该信息并使用它来确定如何对数据元素进行排序。

FWIW,C让你更简洁地表达......

1

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

qsort()

...或者,如果你确定,以下内容永远不会在数学上小于return intOne < intTwo ? -1 : intOne == intTwo ? 0 : 1; (这些值不恰当地包围一个大的正数)......

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

答案 2 :(得分:3)

你所谓的'sortFunction'通常被称为比较器。它基本上告诉qsort()中的通用排序代码是否排序的数组中的两个元素是否比较等于(0),或者第一个参数是否在第二个(&lt; 0)之前排序或第一个参数在第二个之后排序( &GT; 0)

使用该信息,加上每行的大小,加上数组中的行数和数组的开头,qsort()函数可以正确排序数据。

答案 3 :(得分:0)

正如您在documentation中看到的那样,qsort函数将比较器作为最后一个参数。此函数用于实际比较参数(告诉哪一个应该在排序数组中首先出现)。

答案 4 :(得分:0)

看看这篇文章是否有帮助。它讨论了如何使用回调函数以及如何使用回调函数实现qsort等函数。 http://learnwithtechies.com/index.php/component/content/article/4-c/18-callback-functions-in-c-can-be-very-handy