【发布时间】:2018-10-23 13:53:54
【问题描述】:
我目前是一名正在学习 c++ 课程的大学生,但我被这个问题困住了。 "定义一个函数
void smallSort(int nums[], int length)
使用“小排序”算法对一系列小数字进行排序。 (在我们的例子中,“小”表示 0 到 9999 之间的任何值。)该算法的工作原理如下:声明一个名为 counts 大小为 10000 的本地 int 数组并将每个元素初始化为 0。然后循环遍历数组 nums 并为每个数字递增具有该索引的计数元素。最后一步是遍历 counts 数组并将值复制回 nums。例如,如果您的循环当前位于 counts 数组的元素 3 并且 counts[3] 包含一个 10,则您可以将 10 个 3 复制到 nums 数组中。
例如:假设 nums 是 { 1, 4, 3, 0, 0, 4, 1, 4, 1, 2, 6, 4, 6, 0, 0, 0, 0, 4} 并且长度是18. 然后在填充完counts数组后,它会包含值{6, 3, 1, 1, 5, 0, 2, ... },counts[6]之后的所有元素都等于0。那是因为数组nums 包含六个 0、三个 1、一个 2、一个 3、五个 4、零个 5、两个 6,并且没有大于 6 的值。在算法的下一阶段,我们将遍历 counts 数组并复制回六个 0,然后三个 1,一个 2 等到 nums 数组中,因此它包含 {0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 6, 6 }。请注意,nums 现在按升序排序。”
这是我的解决方案:
void smallSort(int nums[], int length){
int count [10000];
int a = 0;
for(int i =0; i<10000; i++){
count[i] = 0;
}
for(int i =0; i<length ; i++){
count[nums[i]]++;
}
for(int i = 0; i< length; i++){
for(int j = 0; j<count[i]; j++){
nums[a] = count[i];
a++;
}
}
}
这是我应该得到的答案: 0·1210·3000·2434·446·54·111·900·43·7·17·1001·9999·0·0·9999·1210·54↵ 0·0·0·7·17·43·54·54·111·446·900·1001·1210·1210·2434·3000·9999·9999·↵
这就是我得到的: 0·1210·3000·2434·446·54·111·900·43·7·17·1001·9999·0·0·9999·1210·54·↵ 3·3·3·1·1·54·111·900·43·7·17·1001·9999·0·0·9999·1210·54·↵
我已经尝试解决这个问题超过 2 小时,由于我一直出错,我决定在 Xcode 上创建自己的数组并尝试解决它,但“count[nums[i]]”旁边出现错误++;"上面写着“线程 1:EXC_BAD_ACCESS (code=1, address=0x7ffeefc15928)”。
【问题讨论】:
-
您的最终 for i 循环中有 2 个错误,循环执行次数错误,您将错误的值分配给
nums[a] -
嗨@AlanBirtles,你能解释一下我是如何将错误的值分配给 nums[a] 的吗?我最初将 nums[a] 分配给 count[i] 因为数组 count 已经排序,并且 j 循环会将 count[i] 处的数字固定次数。
-
count[i]存储i的出现次数。因此,我不明白您为什么在最后一个循环中将count[i]分配给nums[a]。 (如果你不明白我的意思,请重新阅读我的第一句话。);-) -
请不要忘记在您的测试集中使用更大的值进行测试。我可以确认@AlanBirtles 是正确的 - 最后两个嵌套循环中还有另一个错误。