基本思想:在无序序列中,重复比较相邻的两个元素。如这个序列中有 i 个元素,那么拿 第 i 个源与 i+1 个元素比较,如果是升序,i > i+1 ,交换两个元素的位置。如果是降序就不需要交。反之也是这个思想。
冒泡排序是这样操作的:
代码如下:
void BubbleSort(int arr[],int len)
{
int i = 0;
int j = 0;
for (i = 0; i < len - 1; i++)
{
for (j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
swap(arr[j], arr[j + 1]);
}
}
}
}
int main()
{
int arr[] = {3,5,6,8,2,7,1};
int len = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr,len);
return 0;
}
时间复杂度:O(n*n)
空间复杂度:O(1)
稳定性:不稳定
从上面的代码看,冒泡排序的功能已经能满足了排序的功能。可是看看时间复杂度为 O(n*n)
我们仔细想想,我们能如何优化?冒泡的排序思想为:两个元素之间比较,依据条件进行位置的交换。
当无序序列接近有序的时候,我们可以看到冒泡排序的次数还是没有改变。
我们可以这样优化:
void BubbleSort_OP(int arr[], int len)
{
int i = 0;
int j = 0;
int flag = 1;
for (i = 0; i < len - 1; i++)
{
if (flag == 0)
break;
flag = 0;
for (j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
flag = 1;
swap(arr[j], arr[j + 1]);
}
}
}
}
优化后:
优化后的冒泡排序,如果序列接近有序,那么会直接跳出循环,减少了运行次数,效率提高了。