当前位置: 首页 > news >正文

双向冒泡算法 Double Bubble

双向冒泡算法比单向冒泡更适用于序列基本有序,但是有小元素在尾部,例如数列

1,2,3,4,5,6,7,8,9,0

如果使用单向冒泡算法,时间复杂度将是O(n^2)

改进的双向冒泡时间复杂度是O(n)

下面是双向冒泡算法的代码

/* 
* R[]存放待排序数据,从0开始存放,共n个记录
*/
#define bool _Bool
#define true 1
#define false 0

void Double_Bubble(int R[],int n)
{
int i,j;
int tmp;
bool exchange=true;
i=0;
while(exchange)
{
exchange=false;
for(j=i;j<n-i-1;j++)//向右扫描
{
if(R[j]>R[j+1])
{
exchange=true;
tmp=R[j];R[j]=R[j+1];R[j+1]=tmp;
}
}
for(j=n-i-1;j>i;j--)//向左扫描
{
if(R[j]<R[j-1])
{
exchange=true;
tmp=R[j];R[j]=R[j-1];R[j-1]=tmp;
}
}
i++;//每趟扫描结束都可以在两头确定一个元素的位置
}
}
/**************************************************************************
* Problem: 双向冒泡算法
* Copyright 2011 by Yan
* DATE:
* E-Mail: yming0221@gmail.com
***********************************************************************
*/

/*
* R[]存放待排序数据,从0开始存放,共n个记录
*/
#define bool _Bool
#define true 1
#define false 0

void Double_Bubble(int R[],int n)
{
int i,j;
int tmp;
bool exchange=true;
i=0;
while(exchange)
{
exchange=false;
for(j=i;j<n-i-1;j++)//向右扫描
{
if(R[j]>R[j+1])
{
exchange=true;
tmp=R[j];R[j]=R[j+1];R[j+1]=tmp;
}
}
for(j=n-i-1;j>i;j--)//向左扫描
{
if(R[j]<R[j-1])
{
exchange=true;
tmp=R[j];R[j]=R[j-1];R[j-1]=tmp;
}
}
i++;//每趟扫描结束都可以在两头确定一个元素的位置
}
}

该算法还能进一步改进,就是在数列的两端设置bound,用于记录最后一次交换的位置,这样可以进一步减少比较次数,进而减小时间复杂度。

转载于:https://www.cnblogs.com/seoer/archive/2011/11/14/2248300.html

相关文章:

  • [转载]用三张图片详解Asp.Net 全生命周期
  • Oracle字符集的查看查询和Oracle字符集的设置修改
  • grep时间点之间的log
  • linux各文件夹的作用
  • 【转】Pitaschio: 右键单击关闭窗口, 告别 bbskin
  • VS 命令行编译C#项目
  • mysql rpm安装 开启innodb
  • 【转载】MiniUtilityFramework(三):配置文件概述
  • 如何免费下载百度文库文章的三种方法
  • WP7开发学习笔记----1
  • 国内与国外网管待遇差别的评论
  • div隐藏输入框
  • 李开复:中国即将迎来IT的黄金时代(转)
  • redmine-1.2.2安装服务(附图)
  • 设计模式系列6-----C++实现状态模式(State Pattern)
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • FineReport中如何实现自动滚屏效果
  • golang中接口赋值与方法集
  • Gradle 5.0 正式版发布
  • HTML-表单
  • HTTP那些事
  • interface和setter,getter
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Mysql优化
  • Python - 闭包Closure
  • vue脚手架vue-cli
  • vue自定义指令实现v-tap插件
  • 初探 Vue 生命周期和钩子函数
  • 工作中总结前端开发流程--vue项目
  • 我是如何设计 Upload 上传组件的
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 因为阿里,他们成了“杭漂”
  • 追踪解析 FutureTask 源码
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (译)2019年前端性能优化清单 — 下篇
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .Net中wcf服务生成及调用
  • [AutoSar]BSW_Com02 PDU详解
  • [BT]BUUCTF刷题第4天(3.22)
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [C/C++] -- 二叉树
  • [CareerCup] 14.5 Object Reflection 对象反射