排序算法c语言描述---双向冒泡排序

2023-11-04

排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析。

文章规划:

一。通过自己对排序算法本身的理解,对每个方法写个小测试程序。 具体思路分析不展开描述。

二。通过《大话数据结构》一书的截图,详细分析该算法 。 

在此,推荐下程杰老师的《大话数据结构》一书,当然不是打广告,只是以一名读者的身份来客观的看待这本书,确实是通俗易懂,值得一看。

ps:一个较为详细的学习链接   http://blog.csdn.net/MoreWindows/article/category/859207


八。双向冒泡排序。

一。个人理解

首先,这篇文章是建立在已经了解了冒泡排序的基础上写的。 如果对普通冒泡排序还有什么不懂的,可以看看我之前的一篇博客。

排序算法c语言描述---冒泡排序  http://blog.csdn.net/hitwhylz/article/details/9773589


下面简单谈谈双向冒泡。

双向冒泡排序是在冒泡排序的基础上改进而来的,其基本思想跟最原始的冒泡排序是一样的,只不过排序过程稍微优化了一点。

我们还是以整数升序排序为例来简单说说这种排序的过程:首先从前往后把最大数移到最后,然后反过来从后往前把最小的一个数移动到数组最前面,这一过程就是第一轮,然后重复这一过程,最终就会把整个数组从小到大排列好。双向冒泡排序要稍微优于传统的冒泡排序,因为双向排序时数组的两头都排序好了,我们只需要处理数组的中间部分即可,而单向即传统的冒泡排序只有尾部的元素是排好序的,这时每轮处理都需要从头一直处理到已经排好序元素的前面一个元素。虽然它在效率上有了点改进,但它也不能大幅度提高其排序的效率,这是由冒泡排序的基本过程所决定了的。

所以就本质来说,算法上也没什么优化,只是双向调整而已。下面具体看代码。

#include<stdio.h>

#define Max_ 10

// 打印结果
void Show(int  arr[], int n)
{
    int i;
    for ( i=0; i<n; i++ )
        printf("%d  ", arr[i]);
    printf("\n");
}

// 交换数组元素位置
void Swap( int *num_a, int *num_b )
{
    int temp = *num_b;
    *num_b = *num_a;
    *num_a = temp;
}

//改进版的冒泡排序(双向冒泡)
void BidBubbleSort(int array[], int n)
{
    int low, high, flag, i;
    low = 0;
    high = n - 1;
    while(low < high)
    {
        flag=0;
        for(i=low; i<high; i++)  //正向冒泡
        {
            if(array[i] > array[i+1]) //找到剩下中最大的
            {
                Swap(&array[i], &array[i+1]);
                flag = 1;    //标志, 有数据交换
            }
        }
        if( !flag )
            break;
        high--;
        for( i=high; i>low; i-- ) //反向冒泡
        {
            if(array[i] < array[i-1])   //找到剩下中最小的
                Swap(&array[i], &array[i-1]);
        }
        low++;
    }
}

int main()
{   //测试数据
    int arr_test[Max_] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };
    //排序前数组序列
    Show( arr_test, Max_ );
    BidBubbleSort( arr_test, Max_);
    //排序后数组序列
    Show( arr_test, Max_ );
    return 0;
}

总的来说,代码也没什么难度,思路也简单,就不多做描述了。


按以往的行文风格,下面应该是《大话数据结构》一书的截图了。

不过,双向冒泡也不算一种全新的算法,顶多是冒泡排序的优化,并且书中也没有相关的知识,就不多做介绍了。

简单的用测试程序中的排序过程来做个总结吧


双向冒泡前数组 8  4  2  3  5  1  6  9  0  7   

1次排序-->4  2  3  5  1  6  8  0  7  9    //第一次正向排序,得到未排序数组中最大的数  9

1次排序<--0  4  2  3  5  1  6  8  7  9    //第一次反向排序,得到未排序数组中最小的数  0

2次排序-->0  2  3  4  1  5  6  7  8  9    //第二次正向排序,得到未排序数组中最大的数  8

2次排序<--1  2  3  4  5  6  7  8  9    //第一次反向排序,得到未排序数组中最大的数  1

3次排序-->0  1  2  3  4  5  6  7  8  9    //运气比较好,前两次已经排好序了,flag = 0,不进行第三次排序

双向冒泡后数组 0  1  2  3  4  5  6  7  8  9  




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法c语言描述---双向冒泡排序 的相关文章

随机推荐

  • thinkphp5学习路程 六 实现分页功能

    实现分页的功能具体的就是这个 paginate paginate 10 20 代表的含义就是一页显示10条数据 显示20页 public function test 查询数据库 result Db table user gt where i
  • 疯狂的联邦学习!研究员年薪百万?

    码农不容易 我这十几年一直在学习 停都停不下来 因为互联网技术发展真的造化弄人 上学那会儿 老师说C 有前途 因为大多数的企业都用它来写服务器程序 过了两年突然原来这个世界是Java的 遂挑灯恶补Spring 然而 技术永远在诞生新的 概念
  • python进行rar、tar、unzip解压

    参考文章链接 https blog csdn net qq 22865879 article details 120849457 1 python进行rar解压 1 需要使用Python的rarfile工具包 下载地址 http sourc
  • 成功打破 GPT-4 上限,新版 Claude 横空出世!

    公众号关注 GitHubDaily 设为 星标 每天带你逛 GitHub 前 OpenAI 团队成员在离职后 创办了 Anthropic 公司 今年 3 月份的时候 该公司推出一款名为 Claude 的应用 试图与 ChatGPT 一争高下
  • 前端工程化之Webpack优化

    打不垮我的 将使我更加坚强 尼采 大家好 我是 柒八九 好久没更文了 其实这段时间 一直没闲着 在准备一些比较重要的东西 忙着跑步 忙着学习 忙着xx 总之就是 一直在忙着 从未停歇 虽然 这段时间 没有文章的发布 其实 在私底下 已经有不
  • [教程]AMD芯片用VirtualBox安装MacOS虚拟机

    您的赞 是小熊更新的动力 本教程非常的简单 只需要几个步骤即可轻松安装好 效果图片 目前 大部分教程都是使用intel的芯片 Vmware软件进行安装macos 但实际上 使用VirtualBox安装MacOS同样也是一件简单的事情 笔者使
  • 【代码随想录】链表刷题

    链表 理论基础 移除链表元素 设计链表 动态单链表 动态双向链表 静态单链表 反转链表 两两交换链表中的节点 删除链表的倒数第 N 个节点 链表相交 环形链表 快慢指针 环形链表 II 很多重复的题参考 代码随想录 双指针法刷题 理论基础
  • 教你在mac上使用git(从安装到在gitee上操作)

    1git是啥 如何安装 分布式的代码版本管理工具 团队协作工具 不是一个人能搞定 开发linux gt 顺手做了个git 张三 gt 一段程序A java 李四 gt 一段程序B java 在两个不同的文件 最传统的手工人工合并 帮助我们进
  • python3对接godaddy API,实现自动更改域名解析(DDNS)

    python3对接godaddy API 实现自动更改域名解析 DDNS 文章开始前 先解释下如下问题 什么是域名解析 域名解析一般是指通过一个域名指向IP地址 A解析 然后我们访问这个域名就可以有直接访问这个IP地址的效果 只需要记住域名
  • matlab用字符串按名索引结构体(struct)的成员变量(field)

    matlab 一个训练函数中的若干记录用一个叫 records 的结构体返回 其中包括多个 loss 的 list vector 现用一个循环遍历这些 loss lists 画图 保存 Code getfield 用字符串取 struct
  • linux目录与文件相关操作

    一 目录相关操作 1 pwd 显示目前所在目录 pwd pwd P 显示真正的所在目录路径 而非链接文件路径 2 mkdir 建立新目录 mkdir lt 目录名 gt mkdir m lt 权限 gt lt 目录名 gt m指定目录的权限
  • [Load balancer does not contain an instance for the service xxx]和项目正常启动但注册不上nacos

    文章目录 可能一 可能二 可能一 远程服务没有注册到nacos 特点 springcloud使用nacos作为注册中心之项目正常启动但注册不上nacos 而且service中不显示端口号 springcloud使用nacos作为注册中心时
  • XSS-Game level 9

    第九关过滤的很严 使用编码绕过 先看源码 过滤了大小写 on 事件 script 以及一些属性 把参数拼接到 value值的时候 还编译了 htmlspecialchars 把预定义字符 lt gt 转换为HTML实体 也就是不起作用 并且
  • 2021 年最新基于 Spring Cloud 的微服务架构分析

    Spring Cloud 是一个相对比较新的微服务框架 2016 年才推出 1 0 的 release 版本 虽然 Spring Cloud 时间最短 但是相比 Dubbo 等 RPC 框架 Spring Cloud 提供的全套的分布式系统
  • C#:转换成中文数字

    代码
  • excel熵值法计算权重_如何用熵值法确定指标权重?

    记得点击蓝字关注我们哦 首先 要运用熵值法当然要理解它 搞懂它 熵值法是一种理论的数学方法 从计算机科学角度上看 属于一种算法 一 熵值法原理 熵的概念源于热力学 是对系统状态不确定性的一种度量 在信息论中 信息是系统有序程度的一种度量 而
  • [第一章 web入门]SQL注入-1

    拿到题目是一篇日记 是GET型请求方式 我们可以直接在url栏中注入数据 判断注入类型 页面有回显所以不是整型注入 id 1 and 1 2 id 1 页面无回显 判断为字符型注入 闭合符应该就是单引号 id 1 order by 4 无回
  • 深度学习之注意力机制(Attention Mechanism)和Seq2Seq

    这篇文章整理有关注意力机制 Attention Mechanism 的知识 主要涉及以下几点内容 1 注意力机制是为了解决什么问题而提出来的 2 软性注意力机制的数学原理 3 软性注意力机制 Encoder Decoder框架与Seq2Se
  • 电商购物网站(登陆注册购物车详情页等)(仿jd)

    电商购物网站 仿jd 源码链接 https gitee com ZRXXUAN shopping https github com ZRXXUAN shopping 介绍 仿照jd写的电商购物网站 可以实现基本功能 登录 注册与数据库交互
  • 排序算法c语言描述---双向冒泡排序

    排序算法系列学习 主要描述冒泡排序 选择排序 直接插入排序 希尔排序 堆排序 归并排序 快速排序等排序进行分析 文章规划 一 通过自己对排序算法本身的理解 对每个方法写个小测试程序 具体思路分析不展开描述 二 通过 大话数据结构 一书的截图