冒泡排序算法(含题目推荐 )

冒泡排序算法是排序算法里面基础算法之一,其理解简单,编程难度小,但是对于初学者来说,理解还是需要认真静下心来手动推演。

其实冒泡排序算法的核心思想就是:每一次从头开始遍历,比较相邻的数,然后把大的数向后面移动(以升序为例),所以每一次遍历,都可以把目前最大的数移到后面,后面的数不需要操作,所以每次遍历的终止条件是 j 从 1 到 i-1;i表示遍历的次数,i+1 到n表示已经排序好的数。

时间复杂度:

    冒泡排序的最优时间复杂度是 O(n), 因为如果是已经排好的顺序列让你用冒泡排序的话,只用遍历一遍,就可以跳出了。这就是标记flag的用意所在,即监视数列中是否已经排序完全。最坏时间复杂度是O(n2)。


下面这个题目就是根据冒泡思想来做的,可以帮助更好的理解。

代码如下:(此题ac代码,也可以作为冒泡排序模板代码,不过需要把注释的去掉) 

#include 
#include 
using namespace std;

/*/冒泡排序  by  tsar/*/ 

int a[10005];
int main()
{
	int n;
	cin>>n;
	for(int i = 1; i <= n; i++)
		cin>>a[i];
	int flag = 1,counts = 0;
	
	for(int i = n; i >= 1 && flag; i-- )
	{
		for(int j = 1; j < i; j++)
		{
			if(a[j] > a[j+1])
			{
				int t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
				counts++;
				flag = 1;
			}
		}
	}
	
	/*for(int i = 1; i < n; i++)
		printf("%d ",a[i]);
	cout<

在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。

你可能感兴趣的:(排序算法总结)