bubble sort改进总结
冒泡排序是最基础的排序算法之一,同时也是一种稳定的排序算法,其时间复杂度为 O( n2 n 2 ) ,下面贴上清华邓俊辉老师所编著的数据结构书中冒泡排序及其改进代码供个人学习。
原版
template <typename T> //向量的起泡排序
void Vector<T>::bubbleSort ( Rank lo, Rank hi ) //assert: 0 <= lo < hi <= size
{ while ( !bubble ( lo, hi-- ) ); } //逐趟做扫描交换,直至全序
template <typename T> bool Vector<T>::bubble ( Rank lo, Rank hi ) { //一趟扫描交换
bool sorted = true; //整体有序标志
while ( ++lo < hi ) //自左向右,逐一检查各对相邻元素
if ( _elem[lo - 1] > _elem[lo] ) { //若逆序,则
sorted = false; //意味着尚未整体有序,并需要
swap ( _elem[lo - 1], _elem[lo] ); //通过交换使局部有序
}
return sorted; //返回有序标志
}
改进版
template <typename T> //向量的起泡排序
void Vector<T>::bubbleSort ( Rank lo, Rank hi ) //assert: 0 <= lo < hi <= size
{ while ( lo < ( hi = bubble ( lo, hi ) ) ); } //逐趟做扫描交换,直至全序
template <typename T> Rank Vector<T>::bubble ( Rank lo, Rank hi ) { //一趟扫描交换
Rank last = lo; //最右侧的逆序对初始化为[lo - 1, lo]
while ( ++lo < hi ) //自左向右,逐一检查各对相邻元素
if ( _elem[lo - 1] > _elem[lo] ) { //若逆序,则
last = lo; //更新最右侧逆序对位置记录,并
swap ( _elem[lo - 1], _elem[lo] ); //通过交换使局部有序
}
return last; //返回最右侧的逆序对位置
}
两个版本区别在于,原版对于几乎有序的向量来说,效率显得不足,原因在于,对于每次扫描后,对应的规模都是固定的缩减 1 ,而对于改进版本,则是检查最后一对逆序对的位置,将下一次扫描缩减到最小需要扫描的区间。