写冒泡排序时遇到的问题及解决办法
背景
学C++ vector时想用个小练习加深理解,于是写了一个对vector内的整数值进行冒泡排序。
冒泡排序的原理
相邻两个元素进行比较,大的放在右边,小的放在左边(从小到大排列),经过一轮循环后最小的元素在最左边。
第一个版本:
#include “bubbleSort.hpp”
#include
#include
using namespace std;
void display(vector vec)
{
for(int i=0;i<vec.size();++i)
cout<<vec[i]<<’ ';
cout<<endl;
}//定义显示函数
void swap(int val1,int val2){int temp=val1;
val1=val2;
val2=temp;
}//实现交换
void bubble_sort(vector<int> vec){
for(int i=0;i<vec.size();++i)
for(int j=i+1;j<vec.size();++j)
if(vec[i]>vec[j])
swap(vec[i], vec[j]);
}
int main(){
int array[8]={8,45,34,67,12,39,9,2};
vector<int> vec(array,array+8);
cout<<"vector before sort: ";
display(vec);
bubble_sort(vec);
cout<<"vector after sort: ";
display(vec);
}
运行结果如下:
并没有实现预定的功能,到底问题出现在何处?
当swap()改变了val1和val2时,并没有改变vec[i]和vec[j]的值,考虑可能是与参数传给swap()的传递方法有关,查询相关资料得知,当调用swap()函数时,实际上传给swap()的对象被复制了一份,原对象除了和副本有相同的值外没有任何联系。
找到问题后对程序进行修改,设法令swap()对参数和传入的实际对象产生关联,用到了pass by reference。
对原程序进行修改:
void swap(int &val1,int &val2)
{
int temp=val1;
val1=val2;
val2=temp;
}
再将vec改为一个reference:
void bubble_sort(vector<int> &vec){/…/}
运行结果如下: