zoukankan      html  css  js  c++  java
  • C#数据结构与算法系列(十八):冒泡排序算法(BubbleSort)

    1.介绍

    冒泡排序的基本思想就是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底的气泡一样逐渐向上冒泡。


    因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下
    来没有进行过交换,就说明序列有序,因此要在排序过程中设置
    一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)

    时间复杂度:O(n^2)  

    2.图解

     3.代码实现

    using System;
    
    namespace DataStructure
    {
        public class BubbleSort
        {
            /// <summary>
            /// 测试
            /// </summary>
            public static void Test()
            {
                int[] arr = { 3, 9, -1, 10, 20 };
    
                Console.WriteLine("排序的数组:" + ArrayToString(arr));
    
                Console.WriteLine("
    优化后的数组排序");
    
                Sort(arr);
    
                Console.WriteLine("
    优化前的数组排序");
    
                arr = new int[] { 3, 9, -1, 10, 20 };
    
                for (int i = 0; i < arr.Length - 1 - 0; i++)
                {
                    int temp = 0;
    
                    if (arr[i] > arr[i + 1])
                    {
                        temp = arr[i];
    
                        arr[i] = arr[i + 1];
    
                        arr[i + 1] = temp;
                    }
                }
    
                System.Console.WriteLine("
    第一次排序的结果:" + ArrayToString(arr));
    
                for (int i = 0; i < arr.Length - 1 - 1; i++)
                {
                    int temp = 0;
    
                    if (arr[i] > arr[i + 1])
                    {
                        temp = arr[i];
    
                        arr[i] = arr[i + 1];
    
                        arr[i + 1] = temp;
                    }
                }
                System.Console.WriteLine("
    第二次排序的结果:" + ArrayToString(arr));
    
                for (int i = 0; i < arr.Length - 1 - 2; i++)
                {
                    int temp = 0;
    
                    if (arr[i] > arr[i + 1])
                    {
                        temp = arr[i];
    
                        arr[i] = arr[i + 1];
    
                        arr[i + 1] = temp;
                    }
                }
                System.Console.WriteLine("
    第三次排序的结果:" + ArrayToString(arr));
    
    
                for (int i = 0; i < arr.Length - 1 - 3; i++)
                {
                    int temp = 0;
    
                    if (arr[i] > arr[i + 1])
                    {
                        temp = arr[i];
    
                        arr[i] = arr[i + 1];
    
                        arr[i + 1] = temp;
                    }
                }
                System.Console.WriteLine("
    第四次排序的结果:" + ArrayToString(arr));
            }
    
            /// <summary>
            /// 将数组转换成String
            /// </summary>
            /// <param name="arr"></param>
            /// <returns></returns>
            public static string ArrayToString(int[] arr)
            {
    
                string result = "";
    
                for (int i = 0; i < arr.Length; i++)
                {
                    result += arr[i] + ",";
                }
    
                return result;
            }
            /// <summary>
            /// 排序算法优化并封装
            /// </summary>
            /// <param name="arr"></param>
            public static void Sort(int[] arr)
            {
                //标识标量,表示是否被交换过
                bool flag = false;
    
                //临时变量
                int temp = 0;
    
                //要排序的次数,arr.Length-1 
                for (int i = 1; i < arr.Length; i++)
                {
                    //第几次排序
                    for (int j = 0; j < arr.Length - i; j++)
                    {
                        //如果前面的数大于后面的数,则交换
                        if (arr[j] > arr[j + 1])
                        {
                            flag = true;
    
                            temp = arr[j];
    
                            arr[j] = arr[j + 1];
    
                            arr[j + 1] = temp;
                        }
                    }
                    //每次排序的结果
                    System.Console.WriteLine("" + i + "次排序的结果:" + ArrayToString(arr));
    
                    if (!flag) break; //在一趟排序中,一次交换都没有发生过
    
                    else flag = false; //重置flag进行下次判断
    
                }
            }
        }
    }

    4.结果图

  • 相关阅读:
    部署iis服务器与c#程序遇到的问题小结
    Installing node-oracledb on Microsoft Windows
    Navicat:cant create OCI environment.
    socket.io 中文手册 socket.io 中文文档
    现有的情绪
    Express 4.x Node.js的Web框架
    结构与类的对象在引用上的不同之处
    Android时间戳转换为标准Datetime(yyyy-MM-dd hh:mm:ss)格式
    ASP.NET MVC4中调用WEB API的四个方法
    安恒DASCTF 四月战 WP
  • 原文地址:https://www.cnblogs.com/vic-tory/p/13194868.html
Copyright © 2011-2022 走看看