引言
排序算法中的冒泡排序算法应该算是大家最熟悉的,冒泡排序其实就是交换排序中的一种,是一种稳定的排序算法(两个相同的数不会交换位置),但是时间复杂度有点高,所以效率很低。冒泡排序的实现原理就是对一个无序数组中的数进行两两交换,每一轮都会通过交换把最大的数放到后面去(从小到大排序)。
具体思路
现在有一个无序数组a[8],其包含元素分别为3,7,9,1,2,0,5,6,现在第一轮从第一个数开始遍历,遍历时第一个数与后面相邻的数进行比较,如果前面的数比后面的数小就不交换(从小到大排序),如果前面的数比后面的数大就交换位置,然后第二个数与第三个数进行比较,依次到最后第二位与最后一位比较后结束这轮遍历,这样这个无序数组中最大的一位数必定到了最后一位了,然后进行第二轮遍历,把前面n-1个数中最大的数通过两两比较交换位置放到最后第二位,再依次重复以上步骤,直到数组有序。
- 第一轮遍历
i=0 a[0]与a[1]比较 [3],[7],9,1,2,0,5,6 //3比7小,不交换
i=1 a[1]与a[2]比较 3,[7],[9],1,2,0,5,6 //7比9小,不交换
i=2 a[2]与a[3]比较 3,7,[1],[9],2,0,5,6 //9比1大,交换(这里已经交换位置了)
i=3 a[3]与a[4]比较 3,7,1,[2],[9],0,5,6 //9比2大,交换
i=4 a[4]与a[5]比较 3,7,1,2,[0],[9],5,6
i=5 a[5]与a[6]比较 3,7,1,2,0,[5],[9],6
i=6 a[6]与a[7]比较 3,7,1,2,0,5,[6],[9]
- 第二轮遍历
i=0 a[0]与a[1]比较 [3],[7],1,2,0,5,6,9
i=1 a[1]与a[2]比较 3,[1],[7],2,0,5,6,9
i=2 a[2]与a[3]比较 3,1,[2],[7],0,5,6,9
i=3 a[3]与a[4]比较 3,1,2,[0],[7],5,6,9
i=4 a[4]与a[5]比较 3,1,2,0,[5],[7],6,9
i=5 a[5]与a[6]比较 3,1,2,0,5,[6],[7],9
- 第三轮遍历
i=0 a[0]与a[1]比较 [1],[3],2,0,5,6,7,9
i=1 a[1]与a[2]比较 1,[2],[3],0,5,6,7,9
i=2 a[2]与a[3]比较 1,2,[0],[3],5,6,7,9
i=3 a[3]与a[4]比较 1,2,0,[3],[5],6,7,9
i=4 a[4]与a[5]比较 1,2,0,3,[5],[6],7,9
- 第四轮遍历
i=0 a[0]与a[1]比较 [1],[2],0,3,5,6,7,9
i=1 a[1]与a[2]比较 1,[0],[2],3,5,6,7,9
i=2 a[2]与a[3]比较 1,0,[2],[3],5,6,7,9
i=3 a[3]与a[4]比较 1,0,2,[3],[5],6,7,9
- 第五轮遍历
i=0 a[0]与a[1]比较 [0],[1],2,3,5,6,7,9
i=1 a[1]与a[2]比较 0,[1],[2],3,5,6,7,9
i=2 a[2]与a[3]比较 0,1,[2],[3],5,6,7,9
- 第六轮遍历
i=0 a[0]与a[1]比较 [0],[1],2,3,5,6,7,9
i=1 a[1]与a[2]比较 0,[1],[2],3,5,6,7,9
- 第七轮遍历
i=0 a[0]与a[1]比较 [0],[1],2,3,5,6,7,9
代码实现
#include<iostream>
using namespace std;
void bubbleSort(int *a,int n)
{
for(int i=0;i<n-1;i++)
for(int j=0;j<n-i-1;j++)
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
}
int main()
{
int n;
cin>>n;
int *a=new int[n];
for(int i=0;i<n;i++)
cin>>a[i];
bubbleSort(a,n);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
delete []a;
return 0;
}
冒泡排序算法实现算是一种除了调用Sort快排外最简单的排序算法了,也是一种稳定的排序算法,这里再次说下稳定,在一个无序的数组中如果出现相同的数时,冒泡排序是不会交换两个相同的数的位置的,而其他的比如希尔排序什么则需要交换相同的数的位置,所以是不稳定的排序算法。冒泡排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2) ,空间复杂度为 O ( 1 ) O(1) O(1) 。