🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
🏀一、冒泡排序的定义
🌴冒泡排序(Bubble Sort):是常用排序算法中比较简单的一种。其基本思路是将待排序的序列从头遍历到尾,遍历n趟(n为序列元素个数)。每一趟依次比较相邻的两个数,如果顺序错误就交换,然后继续往后遍历,这样一趟下来,最大(最小)的数就被冒到了序列尾部。
⚽二、图解
⚾三、动图演示
🏐四、冒泡排序的特点
1、冒泡排序原理及其简单,容易理解;
2、时间复杂度:O(N^2);
3、空间复杂度:O(1);
4、稳定性:稳定。
⚽五、代码实现
#include<stdio.h>
//冒泡排序,交换排序的一种
//打印函数
void Print(int* arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
}
//交换函数
void Swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
//冒泡排序
void BubbleSort(int* arr, int n)
{
//趟数
for (int i = 0; i < n; i++)
{
//单趟排序
int Ischange = 0;//标志是否发生交换,如果没有就代表已经有序,不需要再排
for (int j = 0; j < n-i-1; j++)
{
if (arr[j] > arr[j + 1])
{
Swap(&arr[j], &arr[j + 1]);
Ischange = 1;
}
}
if(Ischange == 0)
{
break;
}
}
}
void test()
{
int arr[] = { 2,5,9,8,3,-1,7,5,6,7,0 };
int n = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr , n);
Print(arr, n);
}
int main()
{
test();
return 0;
}
🎱六、注意事项
在代码中的这几行代码
//单趟排序
for (int j = 0; j < n-i-1; j++)
{
if (arr[j] > arr[j + 1])
{
Swap(&arr[j], &arr[j + 1]);
}
}
其中控制j的范围必须控制好。
⛳ -i 是因为:随着一趟一趟排序,待排序序列的剩余元素会逐一减少。
if (arr[j] > arr[j + 1])
💉 -1 是因为:上面这句代码,用的是本元素和后一个元素相比,所以j最后只能落到倒数第二个元素上,为了防止越界,所以要-1。