1. 冒泡排序的基本思想:
① 假设我们要得到一个从小到大排列的序列,那么,从头到尾遍历序列,首先对比前两个关键字,如果是逆序的,就交换两个元素的位序,下一个关键字也是如此,以此类推,在遍历上,可以通过设置辅助工作变量,工作变量的取值范围为整个数组下标的取值范围
② 根据上面的思想,每次冒泡排序之后,总有一个关键字可以被放到最终位置,也就是说,每执行一次遍历,就可以确认一个关键字其在整个序列中的位置
③ 需要注意的是:为简化算法步骤,因此,如果一次遍历中,没有发生关键字位序的交换,即说明该序列已经有序,那么我们就可以提前结束算法
2. 冒泡排序的代码分析(重点在于如何理解):
void Bubble_sort(int a[],int len)
{
bool res = false;
for (int j = len-1; j >= 1; j--) {
for (int i = 0; i < j; i++)
{
if (a[i] > a[i + 1])
{
swap(a[i], a[i + 1]);//交换关键字位序
res = true;
}
}
if (res == false) { break; }
}
}
① 两个for循环,第一个for循环,体现的是有序关键字长度的累积,因为前面说过冒泡排序每遍历一次就可以使一个关键字置于最终位置,因此辅助变量j从数组下标的最后一个位序开始,一直到数组下标的第二个位置,这些位置之前的关键字不一定有序,因此,这里在第一个for里面嵌套了第二个for,其目的在与对非有序序列进行冒泡排序
② 布尔变量res的设置:其目的在于判断一次遍历的过程中是否发生关键字位序的交换,如果没有发生交换,说明整体有序,这时就结束程序
3. 冒泡排序的复杂度分析:
① 空间复杂度:设置辅助变量i,j用于遍历数组,因此空间复杂度为常数级别
② 时间复杂度:最好情况是序列全部有序,这时只需要遍历一次序列,时间复杂度为O(n)
最坏情况是序列全部逆序,这时两个for循环嵌套使得时间复杂度达到O(n2)
因此我们不难看出,冒泡排序的时间复杂度取决于初始序列中各个关键字的相对位序