冒泡排序及2种优化方法

阅读: 评论:0

冒泡排序及2种优化方法

冒泡排序及2种优化方法

原博客:白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇 

#include <iostream>
#include <vector>
//#include <cstddef>//size_t
using namespace std;void bubble(vector<int> &vi){if(vi.size()<=1) return ;int n=vi.size();//还是不要用size_t了,要不然,(size_t)0-1会转为正数最大值。/*for(int i=0;i<n-1;++i){//把n-1个数放到正确的位置上,排序就完成了。for(int j=0;j<n-i-1;++j){//把某正确的数入到下标为n-i-1的位置上if(vi[j]>vi[j+1])swap(vi[j],vi[j+1]);}}*///上面的下标太麻烦了for(int i=0;i<n-1;++i){//把n-1个数放到正确的位置上,排序就完成了。for(int j=1;j<n-i;++j){if(vi[j]<vi[j-1])swap(vi[j],vi[j-1]);}}
}
//优化1:用一个标记来判断当前起泡过程是否存在交换,如果不存在,则数组已有序,可以终止排序过程了。
void bubble1(vector<int> &vi){if(vi.size()<=1) return ;bool flag=true;//需要继续排序int n=vi.size();int start=0;while(flag){flag=false;for(int j=1;j<n-start;++j){if(vi[j]<vi[j-1]){swap(vi[j],vi[j-1]);flag=true;}}++start;}
}
//优化2:用flag既表示当前层有交换,又表示当前层交换的最大下标,此下标为一层交换的终止下标
void bubble2(vector<int> &vi){if(vi.size()<=1) return ;int flag=vi.size();while(flag){int temp=0;for(int j=1;j<flag;++j){if(vi[j]<vi[j-1]){swap(vi[j],vi[j-1]);//vi[j]已有序,也就是第j+1位有序了temp=j;//设置下次让第j位有序}}flag=temp;}
}int main(){vector<int> vi;vi={1,8,2,3,7,6,9,5,4};
//    bubble(vi);
//    bubble1(vi);bubble2(vi);for(auto ieh: vi)cout<<ieh<<" ";cout<<endl;return 0;
}


本文发布于:2024-01-28 11:22:13,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064121377069.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:方法
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23