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


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

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

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

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




    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) 
    

    举个栗子黑白88

    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
    

    举个栗子黑白88

    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 —— 具体由大到小,还是由小到大。根据自己的需要调节 ” > < ” 的比较方式,交换顺序不需要变化。
    举个栗子黑白88

    
    

    最后输出结果为:

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

    4

    Bubble Sort —— do while ( - 判定是否满足有序)



    本方法重点在于:判定满足依次排列,有序后跳出循环

    数组中: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) 
    

    举个栗子黑白88

    using System;
    
    namespace TestMaoPao
    {
        /// <summary>
        /// 测试脚本 —— 冒泡排序
        /// </summary>
        class BubbleSort
        {
            /// <summary>
            /// 主入口
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                int[] ints = {5, 4, 3, 8, 9, 1, 7, 2, 0, 6, 10};
                Short(ints);
                foreach (var i in ints)
                {
                    Console.WriteLine(i);
                }
                Console.ReadLine();
            }
    
    
            /// <summary>
            /// 冒泡排序
            /// </summary>
            /// <param name="ints"></param>
            static void Short(int[] ints)
            {
                int  count = 0;
                bool isStop; //声明布尔为 true
                do
                {
                    isStop = false;                           //此标志位,为结束循环
                    for (int i = 0; i < ints.Length - 1; i++) //遍历数组
                    {
                        if (ints[i] > ints[i + 1])
                        {
                            ints[i + 1] = ints[i] + ints[i + 1];
                            ints[i]     = ints[i + 1] - ints[i];
                            ints[i + 1] = ints[i + 1] - ints[i];
                            isStop      = true; //标志位:false
                            count++;
                        }
                    }
                } while (isStop);
                Console.WriteLine("循环次数: " + count);
            }
        }
    }

    最后输出结果为:

    循环次数: 27
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    END

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

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

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

  • 相关阅读:
    个人冲刺6
    个人冲刺5
    个人冲刺4
    学习进度10
    个人冲刺3
    个人冲刺2
    单词统计
    返回一个整数数组中最大子数组的和
    JavaWeb_JavaEE_命名规则 转载http://www.cnblogs.com/xwdreamer/
    软件工程作业(四则运算web界面实现)-3
  • 原文地址:https://www.cnblogs.com/chinarbolg/p/9601478.html
Copyright © 2020-2023  润新知