所以我想做你的基本选择排序。我从书中逐字复制(有一个例外,稍后列出)。这是代码。
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次比较,尽管我并没有特别看到它的结果。
我已经用我的橡皮鸭一行一行地讨论了这个代码,但我们似乎都没有抓住错误。 我哪里做错了?
答案 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);
根据需要更新minValue
和minIndex
。
希望这有帮助。