冒泡排序是借助“交换”进行排序的方法
冒泡排序的排序方式可以有多种,可以将序列中最小的元素“上升到水面”,也可以将序列中最大的元素“沉到水底”,也可以将最小的元素放到水底。。。具体方式依个人喜好而定。
冒泡排序的思想非常简单:
1、将序列中第一个记录的关键字和第二个记录的关键字比较,若为逆序,则交换顺序;比较第二个记录的关键字和第三个记录的关键字的大小,若为逆序则交换顺序。。。依次进行上述操作直到第n-1个记录的关键字和第n个记录的关键字比较为止。
2、对剩下的n-1个记录进行第二趟排序,操作同上
3、重复以上过程直到排序结束位置,排序结束的标志为在一趟排序过程中没有进行交换记录的操作
时间复杂度:o(N*N)
空间复杂度:o(1) 需要一个用于交换记录的空间
以下第二个代码没有考虑“在一趟排序过程中若没有进行交换记录的操作则表示序列中的记录已经是有顺序的”,这段代码一直对序列进行了n-1趟排序;第一段代码考虑了“在一趟排序过程中若没有进行交换记录的操作则表示序列中的记录已经是有顺序的”,效率比第二个高。
#include<iostream>
#include<vector>
using namespace std;
void BubbleSort(vector<int> &ivec){
vector<int>::iterator iter;
int temp,num=1,flag=0; //设置一个标志flag,flag为0时表示该趟排序过程中没有进行数据交换(即:数据已经是按所要求的序列排好了)
iter=ivec.begin();
while(iter!=ivec.end()-1){ //第一趟排序过程
if(*iter<*(iter+1)){
temp=*iter;
*iter=*(iter+1);
*(iter+1)=temp;
flag++;
}
iter++;
}
ivec.pop_back();
cout<<"第"<<num<<"趟排出来的元素为:"<<*iter<<" "<<endl;;
while(ivec.size()>1&&flag!=0){ //如果flag不为0表示在上一次排序过程中进行了数据交换,还要继续进行排序
iter=ivec.begin();
flag=0; //重置flag为0,用于表示此趟排序是否有数据交换
while(iter!=ivec.end()-1){
if(*iter<*(iter+1)){
temp=*iter;
*iter=*(iter+1);
*(iter+1)=temp;
flag++;
}
iter++;
}
num++;
cout<<"第"<<num<<"趟排出来的元素为:"<<*iter<<" "<<endl;
ivec.pop_back(); //用于删除vector中最后的元素
}
cout<<"最后剩余的不用再排的元素为:";
for(iter=ivec.end()-1;iter>=ivec.begin();iter--)
cout<<*iter<<" ";
}
void main(){
vector<int> ivec;
vector<int>::iterator iter;
int v;
cout<<"请输入要排序的序列:";
while(cin>>v)
ivec.push_back(v);
cout<<"排序之前的序列为:";
for(iter=ivec.begin();iter!=ivec.end();iter++)
cout<<*iter<<" ";
cout<<endl;
BubbleSort(ivec);
}
#include<iostream> #include<vector> using namespace std; void BubbleSort(vector<int> &ivec){ vector<int>::iterator iter; int temp; while(ivec.size()>1){ //当序列中有2个以上的元素时执行以下过程,若只有一个元素iter+1出错 iter=ivec.begin(); while(iter!=ivec.end()-1){ if(*iter<*(iter+1)){ temp=*iter; *iter=*(iter+1); *(iter+1)=temp; } iter++; } cout<<*iter<<" "; ivec.pop_back(); //用于删除vector中最后的元素 } cout<<ivec[0]; //最后输出序列中仅剩的一个元素 } void main(){ vector<int> ivec; vector<int>::iterator iter; int v; cout<<"请输入要排序的序列:"; while(cin>>v) ivec.push_back(v); cout<<"排序之前的序列为:"; for(iter=ivec.begin();iter!=ivec.end();iter++) cout<<*iter<<" "; cout<<endl; cout<<"排序之后的序列为:"; BubbleSort(ivec); cout<<endl; }