八大排序算法之冒泡排序算法

引言

排序算法中的冒泡排序算法应该算是大家最熟悉的,冒泡排序其实就是交换排序中的一种,是一种稳定的排序算法(两个相同的数不会交换位置),但是时间复杂度有点高,所以效率很低。冒泡排序的实现原理就是对一个无序数组中的数进行两两交换,每一轮都会通过交换把最大的数放到后面去(从小到大排序)。

具体思路

现在有一个无序数组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)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值