一、算法原理
- 冒泡排序(Bubble sort)是一种比较简单的排序算法,从前到后依次检查数列的每一对相邻元素,一旦发现它们逆序就交换二者位置。显然一轮扫描一般不能达到整体排序,因此需要重复进行这种扫描交换过程,直到数列整体有序。这种算法的名称由来是因为越小(或越大)的元素会经过交换慢慢浮到数列顶端。
二、算法描述
- 假定需要将一个数列按照升序规则排列。
- 从头开始,若第一个大于第二个,就将它们交换,接着比较第二个和第三个,依次类推,直到比较完最后两个。
- 一轮扫描过后,最后一个元素必然是最大值,将待排列的数列长度减一,可以缩短下一轮扫描有效长度。
- 然后从第一个元素开始,再重复以上步骤,直到排序完成。
三、算法复杂度分析
- 假设数列有n个元素,冒泡排序在一轮扫描交换中需要比较n-1对元素,至多需要比较n-1对元素,故每一轮扫描需要执行2(n-1)次基本操作。
- 扫描至多执行n-1轮,因此总共需要执行的基本操作不会超过(2(n-1))^2次。
- 时间复杂度为T(n) = O(2(n-1)^2) = O(n^2)
- 空间上,在数组原址进行排序,不需要额外空间。
四、代码实现
//冒泡排序(升序)
void BubbleSort(int * a, int length)
{
if(a == NULL || length <= 0)
{
printf("输入错误!\n");
return;
}
bool sorted = false; //整体排序标志
while(!sorted)
{
sorted = true;
for(int i = 0; i < length - 1; ++i)
{
if(a[i] > a[i+1])
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
sorted = false;
}
}
length--; //每扫描一轮有效长度-1
}
}