【发布时间】:2014-03-05 15:27:07
【问题描述】:
我仍在学习 C++,所以如果这是一个重复的点,请纠正我的主题,因为我找不到任何好的和有用的解释。 我尝试在我的ascending_ordered_array 类中创建一个函数,它将元素插入到“空”数组中,同时对它们进行排序。 以下是我目前的代码,但不幸的是它不能 100% 正确工作,因为它添加了两个最大的数字作为数组中位置的最后一个。
void ascOrderedArray::push(Datatype p_item, Datatype* p_array, int p_size)
{
int i, j = 0;
int temp, num;
if (p_array[j] < 0)
p_array[j] = p_item;
for (i = 0; i < (p_size - 1); i++)
{
num = p_size;
for (j = (p_size - 1); j >= i; j--)
{
if (p_array[num]> p_array[j])
num = j;
}
temp = p_array[num];
p_array[num] = p_item;
p_array[i] = temp;
}
}
这是 main 的一部分,上面的调用函数尝试将随机数放入其中
for (i = 0; i < size; i++)
{
num = (i + 1)* (rand() % 100);
arr.push(num, arr, size);
}
任何提示我错过了什么?
【问题讨论】:
-
这个函数是不是应该简单地将给定的项目插入给定的数组中,保持过程中的排序顺序?如果是这样,如何知道数组的顶端容量和当前填充大小?
-
这个例子是用于学习c++还是真正的应用程序?如果是后者,您可以使用一些 STL 容器,例如 std::set,它会为您进行排序。
-
@WhozCraig :是的,它应该以正确的顺序将元素插入到给定的数组中,在这种情况下是升序。如果你所说的高端容量是指数组的大小,它是在创建数组时指定的
-
@MatthiasB 这是学习示例,不幸的是,它必须是一个数组
-
您是否可以通过遍历数组来完成此操作,一旦找到新元素的正确索引,然后将该位置之后的所有内容向前移动一个 pos 并将新元素插入正确的位置?如果你这样做,你不能假设数组总是排序的,所以每次插入元素时都不需要再次排序。当前的复杂度总是 n^2 这样做你会降低它到 2n。