1. 起泡排序算法的原理
起泡排序是交换排序的一种,其基本方法是:设待排序元素列中元素的个数为n,首先比较下标为n-2和n-1个元素,如果发生逆序(及前一个大于后一个),则将这两个元素交换;然后对下标为n-3和n-2的元素做同样的处理;重复此过程直到处理完下标为0和1的元素。这称之为一趟起泡,结果将最小的元素交换到待排序元素序列的第一个位置,其他元素也都向最终排序的方向移动。当然在个别情形下,元素有可能在排序中途向相反的方向移动(两元素相等时,不稳定排序,如图一中的25和25*)。氮元素移动总趋势是向最终位置移动。正因为每一趟起泡排序酒吧一个排序码小的元素前移到最后应在的位置,所以叫做起泡排序。这样最多做n-1趟起泡就能把所有元素排好序。
图一:冒泡排序法示意图
2. 起泡排序的基本算法
template<class T>
void BubbleSort(T arr[], int n) {
for (int i = 1; i < n; i++) { //共进行n - 1趟排序:从1到n-1,逐步缩小待排序列
for (int j = n - 1; j >= i; j--) { //反向检测,检查是否逆序
if(arr[j] > arr[j - 1]){ //发生逆序,交换元素的位置
T temp = arr[j];
arr[j] = arr[j - 1];
T[j - 1] = temp;
}
}
}
}
3. 起泡排序的时间复杂度分析
起泡排序算法中,第i趟起泡需要执行n-i次比较和交换操作。因此,i从1到n-1,执行的比较操作的次数为:
(n-1)+(n-2)+ ……+2+1 = O(n² )
从排序的执行过程中可以看到基本的起泡排序的数据比较次数与输入序列中各待排序的数据比较次数与输入序列中各待排序元素的初始排序无关,但数据的交换次数与各待排序元素的初始排序有关,他与逆序的发生有关,最好的情况一次都不需要排序,最差的每一次都需要交换。
4. 起泡排序的改进算法
这里可以对起泡排序算法进行改进。具体到某一个待排序元素序列是可能不需要n-1趟起泡就能全部排好序。为此,可以在算法中增加一个标志exchange,用以标识本趟起泡结果是否发生了逆序和交换,如果没有发生交换,则exchange = false,表示全部元素已经排好序,因而就可以停止处理;如果exchange = true,表示本趟有元素发生交换,还需要执行下一次起泡排序。起泡排序算法的改进算法如下:
template<class T>
void BubbleSort(T arr[], int n) {
bool exchange; //标识本次是否发生交换
for (int i = 1; i < n; i++) { //共进行n - 1趟排序:从1到n-1,逐步缩小待排序列
exchange = false; //每趟起泡之前将exchange赋值false
for (int j = n - 1; j >= i; j--) { //反向检测,检查是否逆序
if(arr[j] > arr[j - 1]){ //发生逆序,交换元素的位置
T temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
exchange = true; //本趟发生了交换
}
}
if (exchange = false)
return; //本次无逆序,停止处理
}
}