#冒泡排序
冒泡排序的核心思想就是:两两相邻的元素进行比较。
通过两层循环控制:第一个循环(外循环),负责把需要冒泡的那个数字排除在外;第二个循环(内循环),负责两两比较交换。
##性能分析
- 平均时间复杂度:O(N^2)
- 最佳时间复杂度:O(N)
- 最差时间复杂度:O(N^2)
- 空间复杂度:O(1)
- 排序方式:In-place
- 稳定性:稳定
解析说明:
冒泡排序涉及相邻两两数据的比较,故需要嵌套两层 for 循环来控制;
外层循环 n 次,内层最多时循环 n – 1次、最少循环 0 次,平均循环(n-1)/2;
所以循环体内总的比较交换次数为:n*(n-1) / 2 = (n^2-n)/2 ;
按照计算时间复杂度的规则,去掉常数、去掉最高项系数,其复杂度为O(N^2) ;
最优的空间复杂度为开始元素已排序,则空间复杂度为 0;
最差的空间复杂度为开始元素为逆排序,则空间复杂度为 O(N);
平均的空间复杂度为O(1) 。
##动画演示
##算法实现
void bubble_sort(int arr[],int sz)
{
int i = 0;
for(i = 0;i < sz - 1;i++)
{
int flag = 0;//假设这一趟已经有序
int j = 0;
for(j = 0;j < sz - i - 1;j++)
{
if(arr[j] > arr[j+1])
{
flag = 1;//发生交换,说明无序
int tmp = arr[j];
arr[j+1] = arr[j];
arr[j] = tmp;
}
}
if(flag == 0) //这一趟如果没有发生交换,说明有序了,后续无需排序了
{
break;
}
}
}
冒泡排序毕竟是一种效率低下的排序方法,在数据规模很小时,可以采用。数据规模比较大时,建议采用其它排序方法。