冒泡排序是最具有教育价值的排序算法之一。
思想:从左到右和相邻的两个数比较,如果前者大(升序),两数交换位置
冒泡排序一共至少需要走n-1趟,每趟可以确定一个数的位置
第一趟过后,最大值已经排在了最后,不必再动,所以每趟排序的次数逐渐减小(不必和最后的数进行比较)
因此,我们可以用镶嵌式循环实现,一个控制趟数,一个控制相邻的数比较并判断交换
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void BubbleSort(int* a,int n)
{
int i = 0;
int j = 0;
for (j = 0; j < n; j++)
{
for (i = 0; i < n-j-1; i++)
{
if (a[i] > a[i + 1])
{
swap(&a[i], &a[i + 1]);
}
}
}
}
优化
当原数组已经是有序的时候,我们只需走一趟,后面的趟数完全没有意义,而判断是否是有序并满足我们需要的顺序只需走第一趟,若第一趟没有交换顺序,说明原数组满足我们的要求,没有必要去再进行下一趟
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void BubbleSort(int* a,int n)
{
int i = 0;
int j = 0;
int flag = 0;
for (j = 0; j < n; j++)
{
for (i = 0; i < n-j-1; i++)
{
if (a[i] > a[i + 1])
{
swap(&a[i], &a[i + 1]);
flag = 1;
}
}
if (flag == 0)
break;
}
}
即使做了优化,在效率方面并没有提升,只是减少了特殊情况的运行时间
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:稳定