冒泡排序和快速排序都属于交换排序,交换排序的基本思想:两两比较待排序的关键字,发现两个元素的次序相反时即进行交换,直到没有反序的元素为止
冒泡排序,也成为气泡排序,是一种典型的交换排序方法,其基本思想是:两比较待排序元素的关键字,发现两个元素的次序相反时即进行交换,直到没有反序的元素为止。快速排序之前也已经进行过记录,这里记录一下冒泡排序
通过无序区中相邻元素间关键字的比较和位置的交换,使得关键字最小的元素如气泡一般逐渐往上“漂浮”直至“水面”。整个算法是从最下面的元素开始,对每两个相邻的关键字进行比较,且使关键字较小的元素换至关键字较大的元素之上,使得经过一趟冒泡排序后,关键字最小的元素到达最上端,接着,再在剩下的元素中找关键字次小的元素,并把它换到第二个位置上,以此类推,直到所有元素都有序为止。
冒泡排序的时间复杂度为O(n2),是一种稳定的排序方法
举个例子说明一下排序过程
假设有一串数据 23,45,7,24,6,46,98,54,33,13升序排序
第一次:
23 | 45 | 7 | 24 | 6 | 46 | 98 | 54 | 33 | 13 |
首先23和45比较,23<45,满足升序条件,不交换位置.
23 | 45 | 7 | 24 | 6 | 46 | 98 | 54 | 33 | 13 |
45和7比较,45>7,次序相反,交换位置,此刻数据变为
23 | 7 | 45 | 25 | 6 | 46 | 98 | 54 | 33 | 13 |
45和25比较,45>25,次序相反,交换位置,此刻数据变为
23 | 7 | 25 | 45 | 6 | 46 | 98 | 54 | 33 | 13 |
45和6比较,45>6,次序相反,交换位置,此刻数据变为
23 | 7 | 25 | 6 | 45 | 46 | 98 | 54 | 33 | 13 |
45和46比较,45<46,满足升序条件,不交换位置.
23 | 7 | 25 | 6 | 45 | 46 | 98 | 54 | 33 | 13 |
46和98比较, 46<98,满足升序条件,不交换位置.
23 | 7 | 25 | 6 | 45 | 46 | 98 | 54 | 33 | 13 |
98和54比较,98>54,次序相反,交换位置,此刻数据变为
23 | 7 | 25 | 6 | 45 | 46 | 54 | 98 | 33 | 13 |
98和33比较,98>33,次序相反,交换位置,此刻数据变为
23 | 7 | 25 | 6 | 45 | 46 | 54 | 33 | 98 | 13 |
98和13比较,98>13,次序相反,交换位置,此刻数据变为
23 | 7 | 25 | 6 | 45 | 46 | 54 | 33 | 13 | 98 |
第一次排序结束,找到了最大的一个元素,并将其放入了正确的位置。第二次找到第二大的元素放入对应的位置……以此类推,就能得到全部有序的列表
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
int n,temp;
cout<<"n:";
cin>>n;
int *a=new int(n);
//初始化
cout<<"输入"<<n<<"个数:";
for(int i=0;i<n;i++){
cin>>a[i];
}
//冒泡排序
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
cout<<"排序后为:";
//输出
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}