所以我希望进行基本的选择排序。我从书中逐字复制(有一个异常(exception)将在后面列出)。这是代码。
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 不会对数据进行排序!
看起来它将数组中的最后一个数字移到前面,然后什么都不做。然而,它似乎确实进行了 190 次比较,尽管我并没有特别看到它的劳动成果。
我已经和我的橡皮鸭逐行讨论了这段代码,但我们似乎都没有发现错误。 我哪里做错了?
最佳答案
isEqual = counters(arr[index], arr[index + 1]);
这行代码比较后面的元素,找出较小的。所以内层循环找到小于前一项的最后一项,但没有找到范围内的最小值。不要与之前的比较,而是与最小值比较:
isEqual = counters(arr[index], minValue);
(请注意,arr[index + 1]
也读取了数组末尾,所以你很幸运它没有崩溃)
关于c++ - 很喜欢选择排序,现在不会排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37713952/