一、基本概念
冒泡排序是一种简单的排序算法,通过不断比较相邻的元素,将较大的元素逐渐向后移动,从而使整个序列按照相应的顺序排列。
冒泡排序的名称来自于排序过程中较小的元素不断“冒泡”到序列的顶端的比喻。
二、算法流程
冒泡排序的核心就是两两比较相邻元素,如果顺序不对就交换位置。每一次循环都可以确定一个位置,最终使得所有元素都排好序。
void bubbleSort(int arr[], int n)
{
for(int i = 0; i < n-1; i++) //n个数需要排序n-1次
{
for(int j = 0; j < n-i-1; j++)
{
if(arr[j] > arr[j+1])
{
swap(arr[j], arr[j+1]); //交换位置
}
}
}
}
三、算法分析
1、时间复杂度:冒泡排序的基本操作是比较和交换两个元素的位置,所以时间复杂度为O(n²)。
2、空间复杂度:冒泡排序是在原数组上进行排序,所以空间复杂度为O(1)。
3、稳定性:冒泡排序是稳定的算法,即在交换元素的时候,相同大小的元素不会改变它们的相对位置。
4、优化:
(1)加入标志位提前结束循环。
void bubbleSort(int arr[], int n)
{
for(int i = 0; i < n-1; i++) //n个数需要排序n-1次
{
bool flag = false; //标志位
for(int j = 0; j < n-i-1; j++)
{
if(arr[j] > arr[j+1])
{
swap(arr[j], arr[j+1]);
flag = true; //发生交换,标志位为true
}
}
if(flag == false) //没有发生交换,提前结束循环
{
break;
}
}
}
(2)限制范围提高效率。对于在某一趟排序中没有发生交换的情况可以直接认为已经排列好了。因此,可以在每一趟排序后记住最后一次发生交换的位置last,下一轮排序只需要循环到last之前即可。
void bubbleSort(int arr[], int n)
{
int last = n-1;
for(int i = 0; i < n-1; i++) //n个数需要排序n-1次
{
bool flag = false;
for(int j = 0; j < last; j++) //只循环到last之前
{
if(arr[j] > arr[j+1])
{
swap(arr[j], arr[j+1]);
flag = true;
last = j; //记录位置
}
}
if(flag == false)
{
break;
}
}
}
四、应用场景
冒泡排序适用于小读量的数据排序,但是时间复杂度较高,因此在大读量数据排序的时候不建议使用。常用于帮助初学者理解排序思路以及简单排错。
五、总结
冒泡排序思想简单,易于理解和实现,但是时间复杂度为O(n²),对于大数据量排序效率较低。可以通过加入标志位和限制范围的方法优化冒泡排序算法。对于初学者来说,冒泡排序可以作为学习排序算法的入门课程。