c++中的复制与手动复制数组

copy vs. manual copying array in C++

本文关键字:复制数组 复制 c++      更新时间:2023-10-16

我需要对数千条记录进行排序。我把每条新记录放在正确的位置,因此我必须改变数组中其余记录的索引。我手工输入:

    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>

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

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

不,创建一个新数组不会更快。不过,不使用冒泡排序会更快。相反,使用快速排序之类的方法。只要谷歌一下c++快速排序,就能看到上百个这样的例子。

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

当前代码在插入元素后移动元素,这是插入到数组中所能做的最好的事情。如果你想改变列表的容量,你只需要在当前数组的空间用完时创建一个新数组。

编辑:

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

如果您在实际生活中需要它,请使用STL qsort (http://www.cplusplus.com/reference/cstdlib/qsort/)。如果你需要它作为作业,创建一个新的数组将会很昂贵,因为运行malloc的时间很长。

在您的情况下最好检查STL数据结构。如果不能使用STL,可以尝试堆排序或快速排序。

如果不允许使用STL容器和算法,您仍然可以将记录放入vector中,然后编写自己的快速排序或合并排序,这很简单。快速排序比冒泡排序和选择排序更有效。

供参考:http://www.algolist.net/Algorithms/Sorting/Quicksort

如果您将循环从顶部向下移动到插入点,而不是从插入点向上移动到顶部,代码将会快得多。有了这个改变,你只需要为每个位置复制一份而不是三份。

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

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