Sorting Algorithm-Bubble Sort

冒泡排序-Bubble Sort

Algorithm:

冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果逆序则交换,知道没有逆序的记录为止。

Ex:

4,3,1,2            

3,1,2,4       最大元素4此时是正确的位置

1,2,3,4       4之前的最大元素3到了正确的位置

1,2,3,4       3之前的最大元素2到了正确的位置


Code:

void Bubble_Sort(vector<int> &v)
{
	for (int i = 0; i < v.size(); i++)
		for (int j = 0; j < v.size() - i - 1; j++)
		{
			if (v[j]>v[j + 1])
			{	
				int temp = v[j];
				v[j] = v[j + 1];
				v[j + 1] = temp;
			}		
		}
}

Optimize:

冒泡排序的优化,假如序列是{2,1,3,4,5,6,7,8,9},也就是说,除了第一和第二的关键字需要交换外,别的都已经是正常的顺序。当i=1时,交换了2和1,此时序列已经有序,但是算法仍然不依不饶地将i=2到9以及每个循环中的j循环都执行了一遍,尽管并没有交换数据,但是之后的大量比较还是大大地多余了。
为了实现如果序列此时有序就不再继续后面的循环判断工作,我们可以改进一下代码,增加一个标记变量flag来实现这一算法的改进。

代码:
void Bubble_Sort2(vector<int> &v)   //优化了的
{
	int i, j;
	bool flag = true;
	for (i = 0; i < v.size() && flag == true; i++)
	{//上次循环已经没有数据交换说明已经全部排好,flag=false,跳出循环,排序结束
		flag = false;
		for (j = 0; j < v.size() - i - 1; j++)
		{
			if (v[j]>v[j + 1])
			{
				int temp = v[j];
				v[j] = v[j + 1];
				v[j + 1] = temp;
				flag = true;
			}
		}
	}
}

Analysis:

适合部分有序的序列

1、时间复杂度
Worst-case:   O(n^2)  逆序
Best-case:     O(n)      如果是有序的序列,根据改进后的代码,就是n-1次的比较  
Average-case   O(n^2)

2、空间复杂度:O(1)

3、Stable Sort

你可能感兴趣的:(冒泡排序)