在C ++中复制与手动复制数组

时间:2013-03-28 19:35:43

标签: c++ sorting

我需要对数千条记录进行排序。我把每次新记录放在正确的位置,因此我必须更改我的数组中其余记录的索引。我像manualy一样制作:

    db[j]=record;
    cout<<tmp.oName<<endl;
    while (j++!=size-1){
        tmp2=db[j];
        db[j]=tmp;
        tmp=db[j];
    }  

这就是我的问题:创建新阵列和使用副本会快得多吗,或者在我当前的代码旁边没有明显的计算时间和内存使用增强?我对C ++很陌生,所以我不确定,这个函数在内部是如何工作的。

包含,我可以使用:

#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>

8 个答案:

答案 0 :(得分:2)

如果您复制数组然后复制到它,它会更慢并使用更多内存。

假设您有一个包含N个点的数组,而我是新项目所在的索引。 复制数组意味着您使用N个更多内存并复制元素N次。如果您只是移动记录,则不再使用内存并执行N-I操作,因为您只需要在新元素之后移位元素。

答案 1 :(得分:1)

不,创建新阵列会更快。不过不使用冒泡排序会更快。而是使用类似快速排序的东西。只需谷歌快速排序c ++,看看它的一百个例子。

答案 2 :(得分:1)

听起来您正在尝试创建自己的排序列表。

当前代码在插入后移动元素,是插入数组时最好的代码。只要您希望列表的容量发生变化,只要当前阵列中的空间不足,您就只需要创建一个新阵列。

编辑:

这是使用基于数组的列表(而不是链表)的成本之一 - 插入需要线性时间O(N)

答案 3 :(得分:1)

如果您需要现实生活,请使用STL qsort(http://www.cplusplus.com/reference/cstdlib/qsort/)。如果您需要它来完成家庭作业,那么创建一个新阵列将是昂贵的,因为有时间运行malloc。

答案 4 :(得分:0)

最好在你的case中查看STL数据结构。如果你不能使用STL,请尝试堆排序或快速排序。

答案 5 :(得分:0)

如果不允许使用STL容器和算法,您仍然可以将记录放入向量中,然后编写自己的快速排序或合并排序代码,这是直截了当的。快速排序比冒泡排序或选择排序更有效。

供参考:

http://www.algolist.net/Algorithms/Sorting/Quicksort

答案 6 :(得分:0)

如果您将循环从上到下更改为插入点而不是从插入点到顶部,代码将会快得多。通过该更改,您只需为每个位置执行一个副本而不是三个。

答案 7 :(得分:0)

正如其他帖子中所提到的,在同一个数组中插入应该比每次复制整个数组更快。

另一方面,您描述插入的方式类似于插入排序。一次插入操作将花费您O(n)。使用堆来管理数组将使插入成本为O(log n),但对于小数组大小可能会更慢。见http://en.wikipedia.org/wiki/Binary_heap