冒泡排序算法的原理:
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)。
稳定性:
冒泡排序是通过两两比较把小的元素往前排,大的元素往后排,所以,如果两个元素相等,是不会交换的,所以冒泡排序是一种稳定的排序算法。