我正在查看cprogramming.com上的选择排序算法 我认为我在实施中发现了一个错误。
如果您使用该算法,则会有一个名为“index_of_min”的变量,我认为该变量应该是“index_of_max”(因为当我测试它时,它是从最大到最小的排序)。
认为这是一个错字或一个小错误,我检查了一些其他网站,如wikipedia和一些鲜为人知的网站,如geekpedia。看起来他们称之为最低指数。
当我通过调试器运行它时,在我看来它确实是最大值的索引。我在某个地方犯了错误吗?
编辑:正如Svante所指出的那样,只有cprogramming的实现是错误的。维基百科和Geekpidia都很好。
答案 0 :(得分:3)
维基百科和geekpedia网站似乎是正确的,cprogramming.com实现实际上有一个错误;这样:
if (array[index_of_min] < array[y])
{ index_of_min = y; }
顺序颠倒了,应该是:
if (array[y] < array[index_of_min])
{ index_of_min = y; }
另一种解决方法是调用变量index_of_max
,但我希望排序算法能够从最小到最大排序,如果这个期望被大多数程序员共享(正如我所假设的那样),那么原理就是最不惊讶的是要求上述修复。
答案 1 :(得分:0)
你是对的。该网站的代码(如下所示)不正确。
for(int x = 0; x < n; x++)
{
int index_of_min = x;
for(int y = x; y < n; y++)
{
if(array[index_of_min] < array[y]) /* Here's the problem */
{
index_of_min = y;
}
}
int temp = array[x];
array[x] = array[index_of_min];
array[index_of_min] = temp;
}
在内循环结束时, for(int y=x; y<n; y++)
,变量 index_of_min
保存最大值的索引< / em>价值。假设设计将数组从最大到最小排序,这是命名不佳的变量。
如果您希望数组排序最小到最大(正如人们所期望的那样),您需要反转if语句:
if (array[y] < array[index_of_min])
{
index_of_min = y;
}
享受,
Robert C. Cartaino
答案 2 :(得分:0)
我只是阅读了代码,但看起来你是对的:要么index_of_min
被错误命名,要么比较落后。
在几个地方看到这个错误并不像看起来那么奇怪。很可能每个都是从一个共同的来源复制的。
答案 3 :(得分:0)
来自Cprogramming.com“它的工作原理是选择数组中最小的(或最大的,如果你想从大到小排序)元素并将它放在数组的头部”所以他们让它从大到大排序很小,代码是错误的,变量命名也不是,index_of_min跟踪数组中的起始点(0)然后在该数组中向前移动。即index_of_min保持最小的索引值。不要把它与该指数的价值混淆。