【问题标题】:Compare function in bubble sort c++冒泡排序C++中的比较函数
【发布时间】:2016-02-06 11:22:34
【问题描述】:

您好,我需要在冒泡排序算法中实现比较功能,但我不知道该怎么做。

比较功能:

int compareNumbers(const void *a, const void  *b)
{
    object *A = (object *)a;
    object *B = (object *)b;
    if(A->number > B->number)
        return 1;
    else if(A->number < B->number)
        return -1;
    else
        return 0;
}

冒泡排序:

void bubble_sort(object tab[],int size_tab)
{
object temp;
for(int i=1; i<size_tab; i++)
{
    for(int j=0; j<size_tab - i; j++)
    {
        if(tab[j].number > tab[j+1].number)
        {               
            temp = tab[j];
            tab[j] = tab[j+1];
            tab[j+1] = temp;
        }

    }   
}

我不确定何时要实现冒泡排序,行:

if(tab[j].number > tab[j+1].number)

应该消失。

【问题讨论】:

    标签: c++ compare bubble-sort


    【解决方案1】:

    基于您拥有的compareNumbers,行

    if(tab[j].number > tab[j+1].number)
    

    应该变成

    if(compareNumbers(&tab[j],&tab[j+1]) == 1)
    

    我还建议将compareNumbers 更改为:

    int compareNumbers(const object *a, const object *b)
    {
        if(a->number > b->number)
            return 1;
        else if(a->number < b->number)
            return -1;
        else
            return 0;
    }
    

    甚至更好,使用references


    让您了解 C++11 的实现方式:

    template <class T>
    void bubble_sort( T tab[], size_t tab_size, std::function<bool(const T&,const T&)> Comp )
    {
        if ( !tab || tab_size < 2 ) return;
        for ( size_t i=1; i<tab_size; ++i )
        for ( size_t j=0; j<tab_size-i; ++j )
            if (Comp(tab[j],tab[j+1])) 
                std::swap(tab[j],tab[j+1]);
    }
    

    然后调用

    bubble_sort( tab, 42, []( const object& a, const object& b )->bool {return a.number < b.number;} );
    bubble_sort( tab, 42, []( const object& a, const object& b )->bool {return a.letter < b.letter;} );
    

    【讨论】:

    • 我必须在冒泡排序中添加函数参数吗?以及如何修改冒泡排序以实现两个不同的比较函数 f.e.比较数字和比较字母。
    • 只要你只比较number成员,你应该确保compareNumbersbubbleSort之前声明。如果您希望能够选择要比较的成员(数字或字母),那么您可以做不同的事情,但这是另一个问题。
    • 感谢您迄今为止的所有帮助。但是你能给我一个提示如何做到这一点。我想我不能再问另一个问题(90 分钟块),我希望能提供更多信息。
    • @Sh3ljohn - 您实际上可以将比较函数转换为单行。您不需要返回 -1、0 或 1 - 您只需要返回 0。考虑到这一点,您可以将正文修剪为:return a-&gt;number - b-&gt;number; 以相反方向排序,您只需反转术语 - return b-&gt;number - a-&gt;number;
    • @enhzflep 您也可以使用std::sort 并将整个事情变成一个单行,但这不是问题所在。 :) 他的比较功能实现了strcmp-style,和其他的选择一样,没有理由先验的改变。
    【解决方案2】:

    试试类似的东西

    bool compareNumbers(const void* a, const void* b) {
        object* A = (object*) a;
        object* B = (object*) b;
        if (A->number <= B->number) {
            return true;
        } else {
            return false;
        }
    }
    

    然后更改bubbleSort参数以使其看起来像

    void bubbleSort(object tab[], int size_tab, 
                    bool(comparator*)(const void*, const void*))
    

    现在您可以将指向compareNumbers 函数的指针作为bubbleSort 函数的第三个参数传递:

    bubbleSort(a, n, &compareNumbers);
    

    并在bubbleSort的实现中使用它:

    void bubbleSort(object tab[], int size_tab, 
                    bool(comparator*)(const void*, const void*)) {
        object temp;
        for (int i = 1; i < size_tab; i++) {
            for (int j = 0; j < size_tab - i; j++) {
                if (comparator(tab + j, tab + j + 1)) {               
                    temp = tab[j];
                    tab[j] = tab[j+1];
                    tab[j+1] = temp;
                }
            }
        }
    }
    

    【讨论】:

    • test.cpp:53:57: 错误:在 '' 令牌之前需要 ')' test.cpp:53:57 : error: '' token 之前的预期')' test.cpp:53:57: error: '*' token 之前的预期初始化程序 @Anton 这是我在编译时得到的输出。
    • 哎呀,if 语句中忘记了右括号。已编辑和修复。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2018-05-10
    • 1970-01-01
    相关资源
    最近更新 更多