【数据结构课程作业报告】1. 对比数组和向量的使用方法 设计两个函数实现冒泡排序算法,待排序数据分别以数组和向量作为参数传递到排序算法子函数,要求通过该子函数对数据进行排序,排序结果返回到主……

本文通过对比数组和向量在冒泡排序算法中的应用,以及实现删除向量重复元素的功能,探讨两者在使用上的差异。实验结果显示,向量具有动态增长长度和优化的迭代器等优点,但在某些操作如内部插入时效率较低。同时,文章分析了删除向量重复元素的算法时间复杂度可能为O(n^2)。
摘要由CSDN通过智能技术生成

一、实验目的:

  1. 数组与向量的对比
  2. 掌握向量的使用

二、实验内容:

1. 对比数组和向量的使用方法

    设计两个函数实现冒泡排序算法,待排序数据分别以数组和向量作为参数传递到排序算法子函数,要求通过该子函数对数据进行排序,排序结果返回到主函数,不得修改破坏原始待排数据;

2. 设计函数,实现删除向量中所有重复元素的功能。要求:尽可能避免数据大量移动,同时保持原始数据顺序,并分析算法的时间复杂度。

三、实验过程

1. 第一题

1.1数组

(1)程序代码

#include<iostream>

using namespace std;

int *paixu(int *,int *,int);

int main(){

int one[15]={12,12312,242,12,3143,521,34,23,4,2,213,43,12,421,42};

int *example=one;

int *ans=new int [15];

for(int i=0;i<15;i++){

ans[i]=i;

}

ans=paixu(example,ans,15);

cout<<"first:";

for(int i=0;i<15;i++){

cout<<one[i]<<" ";

}

cout<<endl;

cout<<"later:";

for(int i=0;i<15;i++){

cout<<one[ans[i]]<<" ";

}

cout<<endl;

return 0;                                                    

}

int *paixu(int *ex,int *key,int size){

for(int i=0;i<size-1;i++){

for(int j=0;j<size-1-i;j++){

if(ex[key[j]]>ex[key[j+1]]){

swap(key[j],key[j+1]);

}

}

}

return key;

}

(2)运行结果

(3)结果分析

得到预期结果

1.2向量

(1)程序代码

#include<iostream>

#include<vector>

using namespace std;

vector<int> paixu(vector<int>,vector<int>,int);

int main(){

vector<int>one={12,12312,242,12,3143,521,34,23,4,2,213,43,12,421,42};

vector<int>record;

for(int i=0;i<one.size();i++){

record.push_back(i);

}

vector<int>ans=paixu(one,record,15);

cout<<"first:";

for(int i=0;i<15;i++){

cout<<one[i]<<" ";

}

cout<<endl;

cout<<"later:";

for(int i=0;i<15;i++){

cout<<one[ans[i]]<<" ";

}

cout<<endl;

return 0;                                                    

}

vector<int>paixu(vector<int>ex,vector<int>key,int size){

for(int i=0;i<size-1;i++){

for(int j=0;j<size-1-i;j++){

if(ex[key[j]]>ex[key[j+1]]){

swap(key[j],key[j+1]);

}

}

}

return key;

}
  1. 运行结果

  1. 结果分析

得到预期结果

2.第2题

(1)程序代码

#include<iomanip>

using namespace std;

int main(){

clock_t start,end;

double diff;

start=clock();

vector<int> way(vector<int>);

const int upper=15;

vector<int> one={12,23,32,53,12,12,32,52,234,34,24,4,23,21,4};

vector<int>ans(way(one));

for(int i=0;i<ans.size() ;i++){

cout<<ans[i]<<" ";

}

end=clock();

diff=(end-start)/double(CLOCKS_PER_SEC);

cout<<endl<<"time:";

cout<<setprecision(9)<<diff;

    return 0;

}



vector<int> way(vector<int> a){

vector<int>b;

for(int i=0;i<a.size();i++){

int j=0;

for(j=0;j<b.size();j++){

if(a[i]==b[j])break;

}

if(j==b.size()){

b.push_back(a[i]);

}

}

return b;

}

(2)运行结果

(3)结果分析

得到预期结果

时间复杂度(不确定!!):o(n*n/2)

四、小结与收获

数组和向量的对比

1.向量可以动态增长长度

2.数组在内存中分配的连续空间,多次分配释放后有内存碎片,但是向量是动态增长的,不是连续的,所以不会出现内存碎片

3.向量迭代器和函数优化了部分算法

4.数据不允许拷贝和赋值,既不能将数组的内容拷贝到其他数据作为其初始值,但是向量可以的

5.在内部进行插入操作,向量的效率低下,向量的优势体现在在末端进行删减

6.当向量的动态长度超过默认分配的大小后,需要整体重新分配,拷贝和施放

运行结果图上传时丢失,完整版可见主页资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慈善区一姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值