冒泡排序

冒泡排序算法的原理:

1、比较相邻的元素,如果第一个比第二个大,就交换它们两个。

2、对每一组相邻元素做同样的操作,一趟完成后,最后的元素就是最大的数。

3、对所有元素重复上述步骤,除了最后一个数

4、持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较。

算法代码如下:

void  BubbleSort(int a[], int n)
{
	int temp;
	for (int i = 0 ; i < n - 1; ++i)
	{
		for (int j = 0; j < n - 1 - i; ++j)
		{
			if (a[j] > a[j+1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}

加入我们的待排序记录是{2,1,3,4,5,6,7,8,9}在第一趟交换了1和2之后,序列已经有序,因此后面的比较趟数都不需要了,但是算法仍然会执行剩下无用的操作  ,因此我们可以在原有算法基础上做一些优化,优化后的代码如下:

void  BubbleSort(int a[], int n)
{
	int temp;
	Status flag = TRUE;
	for (int i = 0 ; i < n - 1 && flag == TRUE; ++i)
	{
		flag = FALSE;
		for (int j = 0; j < n - 1 - i; ++j)
		{
			if (a[j] > a[j+1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
				flag = TRUE;
			}
		}
	}
}

通过加入一个标识变量,如果发现一趟下来没有可交换的元素,则表示序列已排好序。

时间复杂度:

如果待比较记录集合一开始就是有序的,那只需要比较n-1次,时间复杂度为O(n), 如果待排序记录集合一开始是逆序的,此时需要比较1+2+3+...(n-1) = n(n-1)/2次,并作等量级的记录移动,因此时间复杂度为O(n^2)。

稳定性:

冒泡排序是通过两两比较把小的元素往后排,大的元素往后排,所以,如果两个元素相等,是不会交换的,所以冒泡排序是一种稳定的排序算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章