标签:
内容来自TsinghuaX: 30240184X 数据结构(2015秋)这门课的Vector一章,对bubblesort有两次常数优化。
函数原型是这样的:
void bubble(Rank lo, Rank hi);
void bubbleSort(Rank lo, Rank hi);
Rank即向量元素的秩,在此被定义为int型。lo和hi为待排序区间的左、右界桩。
外部通过调用 v.bubbleSort(lo, hi) 来给向量v的区间[lo,hi)排序,而bubbleSort调用bubble(lo,hi)实现对每个无序子区间的收缩。
最朴素的bubblesort大概是这样,最好最坏平均情况都为O(n^2)
1 //最朴素版 2 void bubble(Rank lo, Rank hi) { 3 while (++lo < hi){//从左至右扫描,修正相邻逆序对 4 if (_elem[lo - 1]>_elem[lo]){ 5 swap(_elem[lo - 1], _elem[lo]); 6 } 7 } 8 } 9 void bubbleSort(Rank lo, Rank hi){ 10 while (lo < hi) bubble(lo, hi--);//右界桩每次向左挪一位 11 }
第一次改进后是这样,这种改进很常见,能使最好情况变为为O(n)。
1 bool bubble(Rank lo, Rank hi) { 2 bool sorted=true;//增设sorted变量,记录此次扫描是否发生交换(未发生交换则sorted=true) 3 while (++lo < hi){ 4 if (_elem[lo - 1]>_elem[lo]){ 5 sorted = false; 6 swap(_elem[lo - 1], _elem[lo]); 7 } 8 } 9 return sorted;//返回是否已有序 10 } 11 void bubbleSort(Rank lo, Rank hi){ 12 while (!bubble(lo, hi--));//一趟扫描没有发生交换(检测结果为sorted)则排序完成 13 }
第二次改进后是这样,可以跳跃式地收缩区间,降低了平均情况常数因子
1 Rank bubble(Rank lo, Rank hi) { 2 Rank last=lo;//设置last变量,记录最后一次交换的位置 3 while (++lo < hi){;} 4 5 swap(_elem[lo - 1], _elem[lo]); 6 if (_elem[lo - 1]>_elem[lo]){ 7 last = lo 8 } 9 return last;//last及以后的元素都已就位,不必再进行扫描 10 } 11 void bubbleSort(Rank lo, Rank hi){ 12 while (lo<(hi=bubble(lo, hi--)));//将右界桩挪到最后一次last位置 13 }
第二次改进可用下图来描述
标签:
原文地址:http://www.cnblogs.com/helenawang/p/4976349.html