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

冒泡排序的多种写法、逻辑

冒泡排序的多种写法、逻辑

本文提供全流程,中文翻译。

Chinar坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)



  • 1
    • Bubble Sort 上推分类法
  • 2
    • Bubble Sort 冒泡排序 - 根据下标
  • 3
    • Bubble Sort 冒泡排序 - 根据轮数

1

Bubble Sort —— 上推分类法



本方法重点在于根据次第来完成运算

1 —— 把最小数移动到最后一位

2 —— 由于最后一位确定,所以在第二次运算时不用计算。所以第二次计算次数 减 1

3 —— 依次类推,就可用简单的for循环来达到排序的目的

4 —— 具体由大到小,还是由小到大。根据自己的需要调节 ” > < ” 的比较方式,交换顺序不需要变化。


数组中:a[0]与a[1] 位置交换的方式,不使用中间变量的情况下 ↓

        a[j] = a[j] + a[j + 1];                  //a[0]=10+120   
        a[j + 1] = a[j] - a[j + 1];              //a[1]=130-120 —— (10)
        a[j] = a[j] - a[j + 1];                  //a[0]=130-10   —— (120) 


举个栗子↓

using System;

namespace TestMaoPao
{
    /// <summary>
    /// 测试脚本 —— 冒泡排序
    /// </summary>
    class BubbleSort
    {
        /// <summary>
        /// 主入口
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            int[] list = { 10, 8, 3, 5, 6, 7, 9, 0, 1, 2 };//声明一个数组

            int count = 0;//记录运算次数

            count = Sort(list);//Sort函数的返回值,赋值给count

            Console.WriteLine(count);//输出count,说明计算多少次

            Console.WriteLine("**********************");//这是一条区分线,仅为了醒目

            for (int i = 0; i < list.Length; i++)//遍历输出(整理后)数组
            {
                Console.WriteLine(list[i]);//根据下标,打印每个值
            }
            Console.ReadKey();//等待用户输入,任意键  (默认运行完,关闭控制台)
        }



        /// <summary>
        /// 计算方式 —— 根据次第运算
        /// </summary>
        /// <param name="a"></param>
        /// <returns></returns>
        private static int Sort(int[] a)
        {
            int count = 0;//记录运算次数的变量

            for (int i = a.Length - 1; i > 0; i--)//控制次第比较的个数,首次为与9个数进行比较
            {
                for (int j = 0; j < i; j++)//
                {
                    count++; //次数自增

                    if (a[j] < a[j + 1])//第一数 < 第二个数
                    {
                        //这里使用了不加临时变量,进行数值交换 (当然加个临时变量也是一样的)

                        a[j] = a[j] + a[j + 1];                   //a[0]=10+120   
                        a[j + 1] = a[j] - a[j + 1];               //a[1]=130-120 —— (10)
                        a[j] = a[j] - a[j + 1];                   //a[0]=130-10   —— (120) 

                                                                  //从而 a[0] 与 a[1] 交换位置

                        //第一次 交换下来,最小值会在最后一个

                        //由于最后一个值已经确定最小。所以外部循环次数减 1 ,第二次只需要比较8个数
                    }
                }
            }
            return count;//Sort函数的返回值 —— 记录运算次数
        }
    }
}

最后输出结果为:

45           (运算次数)
**********************
10
9
8
7
6
5
3
2
1
0

2

Bubble Sort —— 冒泡排序( - 根据下标)



本方法重点在于根据下标来完成运算

1 —— 把最小数移动到第一位

2 —— 由于第一位最小值确定,所以在第二次运算时不用计算。所以第二次计算时,从下标 list[1](也就是第二个数)开始做对比

3 —— 依次类推,就可用简单的for循环来达到排序的目的

4 —— 具体由大到小,还是由小到大。根据自己的需要调节 ” > < ” 的比较方式,交换顺序不需要变化。


数组中:a[0]与a[1] 位置交换的方式,使用中间变量的情况下 ↓

                    int tempNumber = a[j]; ;          //tempNumber = 8
                    a[j] = a[i];                      //a[1]=10                                           
                    a[i] = tempNumber;                //a[0]=8


举个栗子↓

using System;

namespace TestMaoPao
{
    /// <summary>
    /// 测试脚本 —— 冒泡排序
    /// </summary>
    class BubbleSort
    {
        /// <summary>
        /// 主入口
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            int[] list = { 10, 8, 3, 5, 6, 7, 9, 0, 1, 2 };//声明一个数组

            int count = 0;//记录运算次数

            count = Sort(list);//Sort函数的返回值,赋值给count

            Console.WriteLine(count);//输出count,说明计算多少次

            Console.WriteLine("**********************");//这是一条区分线,仅为了醒目

            for (int i = 0; i < list.Length; i++)//遍历输出(整理后)数组
            {
                Console.WriteLine(list[i]);//根据下标,打印每个值
            }
            Console.ReadKey();//等待用户输入,任意键  (默认运行完,关闭控制台)
        }



        /// <summary>
        /// 计算方式 —— 根据下标排序
        /// </summary>
        /// <param name="a"></param>
        /// <returns></returns>
        private static int Sort(int[] a)
        {
            int count = 0;//记录运算次数的变量

            for (int i = 0; i < a.Length; i++)//外部for循环:遍历数组长度个数的下标,首次为0
            {
                for (int j = i + 1; j < a.Length; j++)//内部for循环:遍历数组个数的下标,首次为1
                {
                    count++;//次数自增

                    if (a[j] < a[i]) //第二数 < 第一个数
                    {
                        //把第二个数的值赋值给临时变量 
                        int tempNumber = a[j]; ;          //tempNumber = 8
                        a[j] = a[i];                      //a[1]=10                                           
                        a[i] = tempNumber;                //a[0]=8

                        //从而 a[0] 与 a[1] 交换位置

                        //第一次 交换下来,最小值会在第一个

                        //由于第一个值已经确定最小。
                        //所以外部循环第二次运行时是从第二个数( a[1] )开始的 
                        //第二次内部循环是从 ( a[2] )只需要比较8个数
                    }
                }
            }
            return count;//Sort函数的返回值 —— 记录运算次数
        }
    }
}

最后输出结果为:

45           (运算次数)
**********************
0
1
2
3
5
6
7
8
9
10

3

Bubble Sort —— 冒泡排序( - 根据轮数)



本方法重点在于根据次第来完成运算

1 —— 把最小数移动到第一位

2 —— 由于第一位最小值确定,所以在第二次运算时不用计算。所以第二次计算时,从下标 list[1](也就是第二个数)开始做对比

3 —— 依次类推,就可用简单的for循环来达到排序的目的

4 —— 具体由大到小,还是由小到大。根据自己的需要调节 ” > < ” 的比较方式,交换顺序不需要变化。



举个栗子↓


最后输出结果为:

45           (运算次数)
**********************
0
1
2
3
5
6
7
8
9
10

END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

相关文章:

  • 获取 Android 版本
  • 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录
  • 当微信小程序遇上filter~
  • webpack 简单使用
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • wireshark使用教程
  • 移动端高清、多屏适配方案
  • Java线程池
  • Ubuntu中,加速软件下载和安装的方法
  • Exchange批量获取虚拟目录的内部和外部URL
  • nginx upstream(基于TCP转发)的负载均衡搭建
  • 1.7. Apache Bloodhound
  • IM即时通讯项目讲解(一) 实现类似qq微信表情面板无缝切换
  • 24.5. IN / NOT IN
  • 集合学习
  • [iOS]Core Data浅析一 -- 启用Core Data
  • CSS相对定位
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • JS学习笔记——闭包
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Magento 1.x 中文订单打印乱码
  • Nacos系列:Nacos的Java SDK使用
  • Python实现BT种子转化为磁力链接【实战】
  • Rancher如何对接Ceph-RBD块存储
  • React组件设计模式(一)
  • text-decoration与color属性
  • Vue全家桶实现一个Web App
  • windows下mongoDB的环境配置
  • 前端设计模式
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 06-01 点餐小程序前台界面搭建
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​ubuntu下安装kvm虚拟机
  • ​如何防止网络攻击?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #{}和${}的区别?
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (六)c52学习之旅-独立按键
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (三)模仿学习-Action数据的模仿
  • (转)程序员技术练级攻略
  • ./configure、make、make install 命令
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net6Api后台+uniapp导出Excel
  • .php文件都打不开,打不开php文件怎么办
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • []常用AT命令解释()
  • [Android]创建TabBar
  • [Angular] 笔记 8:list/detail 页面以及@Input