【发布时间】:2020-06-24 02:39:32
【问题描述】:
我正在我的数据结构和算法课程中做这个家庭作业,要求我制作一个随机数数组、一个计数器数组,并使用 C++ 中的这两个数组制作我们自己的排序算法。
计数器数组基本上包含对数字数组进行排序时每个元素应该去的索引,这样 counters[i] 的值将是 array[i] 之后的索引排序。它使用了这个代码,它是由我们的教授给出的:
for (int i = 1; i < arraySize; i++)
for (int j = 0; j < i; j++)
{
if (array[i] < array[j])
counters[j]++;
else
counters[i]++;
}
我认为使用这两个数组,我们将能够设计一个具有 O(n) 时间复杂度的排序算法,所以我试图想办法做到这一点,我想出了这个:
for (int i = 0; i < arraySize; i++)
{
int index = counters[i];
swap(array[i], array[counters[i]]);
swap(counters[i], counters[index]);
}
对于每次迭代,我都将数组 [i] 与数组 [计数器 [i]] 交换,因为计数器 [i] 确定数组 [i] 的索引,然后我还交换计数器中的值以确保计数器与其对应的值保持在同一索引中。
由于某种原因,这没有正确实现排序,但我不明白为什么。
我正在考虑使用另一种排序算法,但我想先尝试这个,因为它会是 O(n)。
有人可以帮忙吗?
谢谢。
【问题讨论】:
-
你知道计算这些“计数器”的循环是 O(N^2),对吧?
-
正如@paddy 所指出的,这与
O(n)并不接近。您是否应该实施counting sort?在输入范围有限的情况下,可以下降到O(n + k)(在时间和空间上),其中n是输入大小,k是值的范围,因此相对有限的范围将有效地@ 987654328@. -
是的,但我关注的是排序算法本身,因为另一个循环是我们的教授给出的。 @paddy
-
@ShadowRanger 对,但我说的是排序算法本身,另一个循环是我们教授给出的
-
@JaMiT 应该是 {0, 1, 2, 3} 对吧?如果我没记错的话,这就是它应该做的。
标签: c++ algorithm sorting data-structures big-o