【问题标题】:Selection sort not sorting first value选择排序不排序第一个值
【发布时间】:2016-10-09 19:01:17
【问题描述】:

我编写了这个 c++ 函数来对数组进行排序,它可以工作,但它似乎不适用于第一个值:它总是更大而不是更小!

    void s_iSort (double a[])
    {
        cout << "INCREASING SORTER:\n\n";
        unsigned int mx,maxx;
        double temp;
        cout << "Insert maximum element to sort: "; cin>>mx;
        for (int c=0; c<mx; c++)
            {
                maxx=0;
                for (int i=c; i<mx; i++)
                    if (a[i]<a[maxx])
                        maxx=i;
                temp=a[c];
                a[c]=a[maxx];
                a[maxx]=temp;

            }
        cout << "\nDONE!\n\n";
    }

这是怎么回事?

【问题讨论】:

  • 请提供minimal reproducible example(您已经接近)以及输入、预期和实际输出
  • 在第一轮if (a[i]&lt;a[maxx]) 将与if (a[0]&lt;a[0]) 相同。然后你就再也不会访问第一个元素了。

标签: c++ sorting selection-sort


【解决方案1】:

您应该使用调试器,或者尝试向橡皮鸭解释您的算法。但是,我处于橡皮鸭的情绪中,并会指出错误:

for (int c=0; c<mx; c++) {
    maxx=0;
    for (int i=c; i<mx; i++) if (a[i]<a[maxx]) maxx=i;
    temp=a[c];
    a[c]=a[maxx];
    a[maxx]=temp;
}

在此循环的每次迭代中,您都希望遍历一系列元素,找到该范围内的最小值并将其作为该范围的第一个元素。它适用于第一次迭代,但在第二次它就出错了。您将maxx(应该是该范围内的第一个元素)初始化为0,即数组的第一个元素。但是,您应该只考虑尚未排序的元素,即将其更改为

maxx = c;

另外请注意,(除了练习之外)你不应该编写自己的排序算法,而是使用std::sort

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多