很喜欢选择排序,现在它不会排序

时间:2016-06-08 22:24:50

标签: c++ class sorting

所以我想做你的基本选择排序。我从书中逐字复制(有一个例外,稍后列出)。这是代码。

void SelectionSort::sort(int arr[], int size)
{
    int isEqual;
    int startScan, minIndex, minValue;

    for (startScan = 0; startScan < (size - 1); startScan++)
    {
        minIndex = startScan;
        minValue = arr[startScan];

        for (int index = startScan + 1; index < size; index++)
        {       
            isEqual = counters(arr[index], arr[index + 1]);

            if (isEqual == 1)
            {
                minValue = arr[index];
                minIndex = index;
            }
        }
        arr[minIndex] = arr[startScan];
        arr[startScan] = minValue;
    }
}

您会注意到我有int isEqual分配给方法counters。我之所以使用它是因为我想保持比较的运行记录。

counters

的代码
int AbstractSort::counters(int a, int b)
{
    counter++;
    if (a < b)
        return -1;
    if (a > b)
        return 1;
    if (a == b)
        return 0;   
}

基本上,它的行为与if (array[index] < minValue)相同,只有这样才能跟踪我的比较。

我在我的QuickSort类中使用此方法,它对数据进行排序并对比较进行计数没有问题。但是,我的SelectionSort不会对数据进行排序!

SelectionSort Error!

看起来它将数组中的最后一个数字移到前面,然后什么都不做。然而它似乎进行了190次比较,尽管我并没有特别看到它的结果。

我已经用我的橡皮鸭一行一行地讨论了这个代码,但我们似乎都没有抓住错误。 我哪里做错了?

3 个答案:

答案 0 :(得分:2)

isEqual = counters(arr[index], arr[index + 1]);

这行代码比较后续元素并找到较小的元素。因此内循环找到小于前一项的最后一项,并且未找到该范围中的最小值。而不是与之前的比较,与最小值进行比较:

isEqual = counters(arr[index], minValue);

(注意,arr[index + 1]也会读取数组的结尾,所以你很幸运它没有崩溃)

答案 1 :(得分:1)

如果您想要的内容与if (array[index] < minValue)类似,那么您应该将minValue传递给counters函数。

答案 2 :(得分:1)

您的选择排序不正确。

首先,“isEqual”相等。

其次,您应该在数组的(未排序的)剩余部分中找到最小值。相反,您正在比较每个相邻的对。

is_less_if_lt0 = counters(arr[index], minValue);

根据需要更新minValueminIndex

希望这有帮助。