一、实验目的:
- 数组与向量的对比
- 掌握向量的使用
二、实验内容:
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;
}
- 运行结果
- 结果分析
得到预期结果
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.当向量的动态长度超过默认分配的大小后,需要整体重新分配,拷贝和施放
运行结果图上传时丢失,完整版可见主页资源