C++排序算法之冒泡排序:
思想:每次遍历,将相邻元素两两比较,前者小,后者大,直至将最大的元素放置在数组尾部,数组长度减1,即未排序部分的长度。
稳定排序,时间复杂度O(n^2),空间复杂度O(1)。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void bubble_sort(vector<int>& nums)
{
int len=nums.size();
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-i-1;j++)
{
if(nums[j]>nums[j+1]) swap(nums[j],nums[j+1]);
}
}
return;
}
int main()
{ int n,x;
cout<<"请输入一个数作为待排序数组元素的个数(正整数):"
cin>>n;
vector<int> nums;
cout<<"待排序数组为:"<<endl;
while(n--)
{
cin>>x;
cout<<x<<" ";
nums.push_back(x);
}
cout<<endl;
bubble_sort(nums);
cout<<"排序后数组为:";
for(int e:nums) cout<<e<<" ";
return 0;
}
在此双层for循环之中,其实可以进一步优化,如果每次交换发现当前序列未发生过交换,则表明该序列已经为有序,无需再次遍历排序。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void bubble_sort(vector<int>& nums)
{
int len=nums.size();
for(int i=0;i<len-1;i++)
{
bool swaped=false;
for(int j=0;j<len-i-1;j++)
{
if(nums[j]>nums[j+1])
{
swap(nums[j],nums[j+1]);
swaped=true;
}
}
if(!swaped) break;
}
return;
}
int main()
{
//省略输入输出格式
int n,x;
cin>>n;
vector<int> nums;
while(n--)
{
cin>>x;
nums.push_back(x);
}
bubble_sort(nums);
for(int e:nums) cout<<e<<" ";
return 0;
}