冒泡排序
冒泡排序是一种较为简单的算法。它重复走访过要排序的元素,依次比较两个相邻的元素。走访元素的工作是重复地进行直到没有元素需要交换,也就是说该元素已经排序完毕了。算法名字由来是因为越小的元素由交换会慢慢“浮”到数列的顶端,就好像气泡一样,所以被称为”冒泡排序“
第一种做法(每次都把小的往前放)
void BubbleSort(vector<int> &vec){
int len = vec.size();//计算该数组的长度
if(len<2){
return; //如果数组的个数小于2,等于说没有数据或者只有它本身!
}for(int i=0;i<len;++i){//一个一个来排,有多少数就排多少次
for(int j=len-1;j>i;--j){//每次都把该范围内最小的数挪到最前面
if(vec[j]<vec[j-1]){
swap(vec[j],vec[j-1]);//如果后一个比前一个小就交换
}
}
}
}
第二种做法(每次把大的往后排)
void BubbleSort(vector<int> &vec){
int len = vec.size();
if(len<2){
return;
}for(int i=0;i<len-1;i++){//这里有-1的细节,因为到了最后一个就不用再排序了
for(int j=0;j<len-i-1;j++){
if(vec[j]>vec[j+1]){
swap(vec[j],vec[j+1]);
}
}
}
}
上述两种代码都很简单,但是出现了一种问题,那就是存在一种排好序了还再进行遍历排序,这样会很浪费空间和时间。那么这个代码要如何优化好呢?其实思考一个细节,如果我们再进行排序遍历的时候,里面的if语句执行的话,如果有标记说明进行了交换操作就好了,然后进行下一次遍历的时候重置标记,以此类推。于是就出现了一种冒泡排序优化后的算法。
优化后的冒泡排序(以改良第一种算法为例)
void BubbleSort(vector<int> &vec){
int len = vec.size();
if(len<2){
return;
}for(int i=0;i<len;++i){
bool flag = false;//用bool数据类型做标记,int也是可以的
for(int j = len-1;j>i;--j){
if(vec[j]<vec[j-1]){
swap(vec[j-1],vec[j]);
flag = true;
}
}
if(flag==false){
return;
}
}
}
补充一下swap(swap就是C++自带的库中已经写好的方法,原理如下)
void swap(int a,int b){
int temp = a;
a = b;
b = temp;
}

浙公网安备 33010602011771号