码迷,mamicode.com
首页 > 其他好文 > 详细

bubblesort的常数优化

时间:2015-11-19 00:43:32      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:

内容来自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 }

第二次改进可用下图来描述

技术分享

 

bubblesort的常数优化

标签:

原文地址:http://www.cnblogs.com/helenawang/p/4976349.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!