选择排序不会捕获重复的数字

时间:2017-05-04 19:21:27

标签: c++ duplicates selection-sort

我要做的是实现一个简单的选择排序算法,该算法使用函数minButGreaterThan来查找数组中的下一个最小数字。我的问题是如果数组有重复的数字,它会被传递并在结尾处离开。我已经尝试更改控制if语句以适应这一点,但似乎没有任何工作。有什么建议吗?

    double GradeBook::minButGreaterThan(double x) // - NEEDS TESTING
    {
        double minButGreaterThan = -1;
        for (int i = 0; i < classSize; i++)
        {
            if (grades[i] > x)
            {
                minButGreaterThan = grades[i];
                break;
            }
        }
        for (int i = 0; i < classSize; i++)
        {
            if (grades[i] > x && grades[i] <= minButGreaterThan)
                minButGreaterThan = grades[i];
        }

        return minButGreaterThan;
    }

void GradeBook::selectionSort() //ascending order -- *DOES NOT WORK WITH DUPLICATE SCORES* - RETEST
{
    double min = absoluteMin();
    for (int i = 0; i < classSize; i++)
    {
        if (grades[i] == min)
        {
            double temp = grades[0];
            grades[0] = grades[i];
            grades[i] = temp;
            break;
        }
    }

    for (int i = 0; i < classSize-1; i++)
    {
        double next = minButGreaterThan(grades[i]);
        for (int n = 1; n <= classSize; n++)
            if (grades[n] == next)
            {
                double temp = grades[n];
                grades[n] = grades[i+1];
                grades[i+1] = temp;
            }
    }

}

1 个答案:

答案 0 :(得分:0)

应该使用重复项,选择排序只需要最小化并将其向左移动到数组的“已排序”部分。

这是我的实施:

#include <algorithm>
#include <vector>

using std::swap;
using std::vector;
using std::min_element;

void selectionSort(vector<int> &v) {
    for (unsigned int i = 0; i < v.size() - 1; i++) {
        auto minElement = min_element(v.begin() + i, v.end());
        auto minIndex = minElement - v.begin();
        swap(v[i], v[minIndex]);
    }
}

您可能需要修改它才能使用浮点数。现在,双浮动精度等级(double)看起来太多了。我认为常规的float是可以的。