简要步骤
冒泡排序通过相邻数据的比较寻找较优值,若与要求的顺序相反则交换位置。
初始序列:{ 4, 6, 3, 0, 2, 5, 1 }
图解说明中只画出了第一轮冒泡情况,也就是i = 0的情况。我们可以发现,每一轮冒泡就是通过相邻数据的比较,把较小值逐渐往上推。第一轮将第一小的值放在i = 0的位置,第二轮将第二小的值放在i = 1的位置,依次类推获得最终排序结果。
性能分析
时间复杂度:冒泡排序的平均时间复杂度为O( N^2 ),当数据正序时,时间复杂度为最优值O( N ),但是当数据反序时,时间复杂度为最差值O( N^2 )。
空间复杂度:在相邻数据交换时,需要额外一个辅助空间,空间复杂度为O( 1 )。
稳定性:冒泡排序只会交换相邻数据,相同数据的前后顺序并不会改变,所以是稳定的。
优化
冒泡排序的常见优化方法是:设立一个标记,用来显示每一轮冒泡中是否有进行数据交换。如果当某一轮冒泡中没有数据交换,那么就会直接跳出循环,避免多余的比较。
代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void Swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
/*
* 基本冒泡排序
*/
void BubbleSort1(int arr[], int length)
{
if(arr == NULL || length < 0)
{
printf("\n输入错误!");
exit(-1);
}
for (int i = 0; i < length; i++)
for (int j = length - 1; j > i; j--)
if (arr[j - 1] > arr[j])
Swap(&arr[j - 1], &arr[j]);
}
/*
* 优化冒泡排序
*/
void BubbleSort2(int arr[], int length)
{
bool flag = false;
if(arr == NULL || length < 0)
{
printf("\n输入错误!");
exit(-1);
}
for (int i = 0; i < length; i++)
{
flag = false;
for (int j = length - 1; j > i; j--)
{
if (arr[j - 1] > arr[j])
{
Swap(&arr[j - 1], &arr[j]);
flag = true;
}
}
if(!flag)
{
break;
}
}
}
int main()
{
int arr[] = {4,6,3,0,2,5,1};
int length = sizeof(arr)/sizeof(arr[0]);
printf("排序前:");
for(int i=0; i<length; i++)
{
printf(" %d",arr[i]);
}
BubbleSort1(arr, length);
printf("\n排序后:");
for(int i=0; i<length; i++)
{
printf(" %d",arr[i]);
}
return 0;
}