冒泡排序的思想
冒泡排序的思想是每次将最大的一下一下移动到最右边,然后将最右边这个确定下来。
再来确定第二大的,再确定第三大的…
对于数组a[n],具体来说,每次确定操作就是从左往右扫描,如果a[i]>a[i+1],我们将执行
swap(a[i],a[i+1])将两项交换,然后再往右检查,这样可以找出最大的并将其丢到最右边。
第一次确定操作是将a[1]~a[n]中最大的放到a[n];
第二次确定操作是将a[1]~a[n-1]中最大的放到a[n-1]。
依次类推(类似地,如果你想先把最小的放到左边也是可以的) 时间复杂度为O(2^n)。
由于排序过程中,数字像冒泡泡一样从左往右换过去,故名冒泡排序。
冒泡排序的实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+9;
int a[N];
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
//i表示当前要确定的位置
for(int i=n;i>=1;i--){
//j从左往右扫
for(int j=1;j<=i-1;j++){
if(a[j]>a[j+1])swap(a[j],a[j+1]);
}
}
//输出
for(int i=1;i<=n;i++)cout<<a[i]<<" \n"[i==n];
return 0;
}
例题讲解
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+9;
int a[N];
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=n;i>=1;i--){
for(int j=1;j<=i-1;j++){
if(a[j]>a[j+1])swap(a[j],a[j+1]);
}
}
for(int i=1;i<=n;i++)cout<<a[i]<<" \n"[i==n];
return 0;
}