首页 > 系统相关 >【C++】相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能性:相对于使用链表算法进行排序,将链表复制到数组中,对数组进行排序,再将排序后的结果复制到链表中的速度可能更快;但

【C++】相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能性:相对于使用链表算法进行排序,将链表复制到数组中,对数组进行排序,再将排序后的结果复制到链表中的速度可能更快;但

时间:2024-02-29 10:36:30浏览次数:28  
标签:复制到 li 链表 vi0 数组 排序

相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能性:相对于使用链表算法进行排序,将链表复制到数组中,对数组进行排序,再将排序后的结果复制到链表中的速度可能更快;但这也可能占用更多的内存。请使用如下方法检验上述假设。

a.创建大型vector<int>对象vi0,并使用rand( )给它提供初始值。

b.创建vector<int>对象vi和list<int>对象li,它们的长度都和初始值与vi0相同。

c.计算使用STL算法sort( )对vi进行排序所需的时间,再计算使用list的方法sort( )对li进行排序所需的时间。

d.将li重置为排序的vi0的内容,并计算执行如下操作所需的时间:将li的内容复制到vi中,对vi进行排序,并将结果复制到li中。

要计算这些操作所需的时间,可使用ctime库中的clock( )。

这种测试并非绝对可靠,因为结果取决于很多因素,如可用内存量、是否支持多处理以及数组(列表)的长度(随着要排序的元素数增加,数组相对于列表的效率将更明显)。另外,如果编译器提供了默认生成方式和发布生成方式,请使用发布生成方式。鉴于当今计算机的速度非常快,要获得有意义的结果,可能需要使用尽可能大的数组。例如,可尝试包含100000、1000000和10000000个元素。

main.cpp:

#include <iostream>
#include <list>
#include <vector>
#include <ctime>
using namespace std;
const int SIZE = 1000000;
int main() {
  vector<int> vi0(SIZE, 0);
  srand(time(0));
  for (int i = 0; i < SIZE; ++i) {
    vi0.at(i) = rand();
  }

  vector<int> vi(vi0);
  list<int> li(SIZE, 0);
  copy(vi0.begin(), vi0.end(), li.begin());

  clock_t start = clock();
  sort(vi.begin(), vi.end());
  clock_t end = clock();
  cout << "sort vector time:" << (double)(end - start) / CLOCKS_PER_SEC << endl;

  start = clock();
  li.sort();
  end = clock();
  cout << "sort list time:" << (double)(end - start) / CLOCKS_PER_SEC << endl;

  copy(vi0.begin(), vi0.end(), li.begin());
  start = clock();
  copy(vi.begin(), vi.end(), li.begin());
  sort(vi.begin(), vi.end());
  copy(vi.begin(), vi.end(), li.begin());
  end = clock();
  cout << "sort copy time:" << (double)(end - start) / CLOCKS_PER_SEC << endl;

  return 0;
}

标签:复制到,li,链表,vi0,数组,排序
From: https://www.cnblogs.com/smartlearn/p/18042861

相关文章

  • 数组构建_cfECR162_C. Find B
    目录问题概述思路分析参考代码问题反思问题概述原题参考:C.FindB对于一个数组a,给出m次咨询,问对于每一次询问的区间是否可以构建出另外一个好的数组b,对于a的好数组的定义是a数组和b数组的元素和相同a数组和b数组的每一位不同b数组的每一位是正数思路分析对于第一个条件......
  • 数组关系_ABC342_D - Square Pair
    目录问题概述思路想法参考代码问题反思问题概述原题参考:D-SquarePair对于长度为n的数组,给出满足要求的数对对数:i<ja[i]*a[j]是一个平方数思路想法其实和以前的数组关系那题差不多,也是找关系,就是关系找不出来而已,对于两数相乘为平方数应该怎么考虑,可以知道对于任意数......
  • 二维数组传参数
    1array<array<int,5>,5>arr;2for(intii=0;ii<arr.size();ii++)3{4for(intjj=0;jj<arr[ii].size();jj++)5{6arr[ii][jj]=jj*10+ii;7}8}9func(arr);1template<typenameT>2voidfunc(c......
  • JAVA基础:数组常见案例
    1.数组找最值packagecom.itheima.arry;publicclassArrayDemo7{publicstaticvoidmain(String[]args){//掌握数组元素求最值int[]faceScore={15,9000,10000,20000,9500,-5};intmax=faceScore[0];for(inti=1;i<faceS......
  • JAVA基础:数组在计算机中的执行原理 多个变量指向一个数组
    程序都是在计算机中的内存中执行的,java程序编译之后会产生一个class文件,这个class文件是提取到内存中的JVM虚拟机中执行的。java为了便于虚拟机这个java程序,也即这个class文件。将虚拟机这块内存区域进行了划分:方法区,栈,堆,  本地方法栈,程序计数器方法区:放编译后的class文件的......
  • 树状数组理解方式
     tr[i]节点存储的是a[i-lowbit(i)+1]+……+a[i],一共lowbit(i)个数字之和。query的理解:intquery(intk){intres=0;for(inti=k;i;i-=lowbit(i))res+=tr[i];returnres;}每次减去当前的lowbit,就可以退回到上一个区间,直至到0modify的......
  • c语言进行时4-函数与数组
    什么是函数?函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或者一个值。函数定义:本地变量(局部变量):函数的每次运行,就产生了而一个独立的变量空间,在这个空间的变量,是函数的这次运行所独有的,称作本地变量,也称局部变量。定义在函数内部的变量就是本地变量。参数也是本地......
  • 350. 两个数组的交集 II C
    /***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/intmin(inti,intj){if(i<j)returni;returnj;}int*intersect(int*nums1,intnums1Size,int*nums2,intnums2Size,int*returnSize){inthash1[1001]=......
  • JAVA基础:数组遍历
    遍历:一个一个访问 packagecom.itheima.arry;publicclassArryDemo2{publicstaticvoidmain(String[]args){//掌握数组遍历int[]ages=newint[]{12,24,36};//System.out.println(ages[0]);//System.out.println(ages[1]);......
  • JAVA基础:数组访问
     packagecom.itheima.arry;publicclassArryDemo1{publicstaticvoidmain(String[]args){//掌握数组访问int[]ages=newint[]{12,52,630};//修改数组中数据ages[0]=66;ages[1]=100;System.out.println(......