冒泡排序(Bubble Sort),是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。
一、冒泡排序基本原理
假设长度为n的数组arr,要按照从小到大排序。每轮从第一个数开始到数组最后一个元素为止,依次与后面的数两两比较大小,若满足条件则交换位置。即每轮最右端的元素即为当前轮次最大值。接着对该数组除最右端的n-1个元素进行同样的操作,再接着对剩下的n-2个元素做同样的操作,直到整个数组有序排列。
动画示例:
![](https://i-blog.csdnimg.cn/blog_migrate/5148a07975f72cd38d4c5ad5f62a638e.gif)
二、实现代码
1.标准实现
将一列数从左到右从小到大排列。
代码如下(示例):
private static int[] BUbbleSortPractice(int[] array)
{
for(int i = 0; i < array.Length; ++i)//有多少个数进行多少轮
{
for (int j = 0; j < array.Length - 1 - i; ++j)//从第一个数开始依次比较
{
if (array[j] > array[j + 1])//满足条件交换位置
{
int temp = array[j];
array[j] = array[j + 1];
array[j+1] = temp;
}
}
}
return array;
}
注意:
1.array.Length - 1是因为当array[j]为最后一个数时无法与下一个数比较
2.array.Length - 1 - i ,i是轮次数,因为每进行一轮都有一个极值放在最后,经过i轮后,第i个数已经是极值了,不需要比较。
2.优化过程
若进行一定轮次之后已经为最终结果则无需继续比较排序。
![](https://i-blog.csdnimg.cn/blog_migrate/72146f31688e603462277243a93aa4a0.png)
代码如下(示例):
private static int[] BubbleSort(int[] array)
{
bool isSort = false;//判断是否进行比较换位
for (int i = 0; i < array.Length; i++)
{
isSort = false;
for (int j = 0; j < array.Length-1-i; j++)//-i是因为每进行一轮最后一个已是极值不需要比较换位
{
if (array[j]>array[j+1])
{
isSort = true;//交换 改变真值
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
if (!isSort)//如果isSort为false则没交换,即最终结果
{
break;
}
//isSort作用:如果第四轮已为最终结果则无需比较排序
}
return array;
}
# 总结
选择排序关键点:
两层循环,外循环代表有多少个数进行多少轮,内循环是依次比较大小满足条件则交换位置。
在比较交换操作过程中,如果第一个元素大于第二个元素,我们才交换两个元素,两个元素相等时,保持不变。所以两个相等的元素在排序前后的相对位置并不会发生变化,所以冒泡排序是稳定排序算法。
时间复杂度:最坏情况:O(N^2)
最好情况:O(N)
空间复杂度:O(1)