1.冒泡排序原理
冒泡排序在扫描过程中两两比较相邻记录,如果反序则交换,最终,最大记录就被“沉到”了序列的最后一个位置,第二遍扫描将第二大记录“沉到”了倒数第二个位置,重复上述操作,直到n-1 遍扫描后,整个序列就排好序了。
2.伪代码
算法3.7——起泡排序
void BubbleSort(int r[ ], int n) //数组下标从1开始
{
for (i=1; i<=n-1; i++)
for (j=1; j<=n-i; j++)
if (r[j]>r[j+1]) r[j]←→r[j+1];//如果反序,则交换元素
}
3.举例
- 从后往前依次比较相邻的元素。若是要按照升序排序,则后面的元素比前面的小,就交换这2个元素;降序则相反。
- 对每一对相邻元素作同样的工作,从第一对到最后一对。进行一轮比较交换下来,最后的元素就会是最小(或最大)的数了,这个数就不用参与后面的比较操作了。
- 针对所有的元素重复以上的步骤。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
例子如下
4.完整代码
#include<iostream>
#include<cmath>
using namespace std;
#define N 500
void BubbleSort(int r[],int n){
for (int i=0; i<n; i++)
for (int j=0; j<n-i-1; j++))//终止条件是j<n-i-1,因为j+1的范围不能超出堆栈,否则结果就会出现本来没有的数字0
if (r[j]>r[j+1])swap(r[j],r[j+1]);
}
int main(){
cout<<"请输入数组中的元素个数n:"<<endl;
int n;
cin>>n;
int r[N];
cout<<"请输入需要选择排序的数组元素:"<<endl;
for(int i=0;i<n;i++)
cin>>r[i];
BubbleSort(r,n);
for(int i=0;i<n;i++){
cout<<r[i]<<" ";
}
return 0;
}
5.运行结果