• 排序算法之选择排序


    时间复杂度和空间复杂度说:

    选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) (因为双循环的原因) 的时间复杂度。
    所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

    算法思想步骤:

    首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

    再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

    重复第二步,直到所有元素均排序完毕。

    动画效果:https://www.runoob.com/w3cnote/selection-sort.html

    图示:

    算法分解:

    第一步找到最大或最少元素:

         //寻找数据最小的元素
         int[] arry = { 5, 2, 1, 7, 4, 3, 6 };
        //第一次是从第0个位置开始的
            FindMinNum (arry, 0);
            static void FindMinNum(int[] arry, int i)
            {
                int mosPos = i;
                for (int j = i + 1; j < arry.Length; j++)
                {
                    if (arry[j] < arry[mosPos])
                    {
                        //找到最小索引
                        mosPos = j;
                    }
                }
                Console.WriteLine("最小值的索引是:" + mosPos);
                Console.WriteLine("最小值是:" + arry[mosPos]);
            }
       //输出了值
    
    

          //下一步就要进行交换了,所以就写一个交换方法

          

      /// <summary>
      /// 交换数据组方法
      /// </summary>
      /// <param name="currentIndex">当前要比较交换的索引</param>
      /// <param name="mosPos">查找到命中到的最大(小)索引值</param>
      /// <param name="arr">数据源</param>
      static void SwapArr(int currentIndex, int mosPos, int[] arr) {
        var temp = arr[currentIndex];
        arr[currentIndex] = arr[mosPos];
        arr[mosPos] = temp;
      }

       //第一次打印结果:

       

     

    第一次效果就是这样分解出来了,完整理的代码 就是在外层加一个循环最找,然后每次替换

      int[] arry = { 5, 2, 1, 7, 4, 3, 6 };

      for (int i = 0; i < arry.Length - 1; i++)
      {
        FindMinNum(arry, i);
      }

       //打印方法
      PrintCw(arry);

     FindMinNum 如下:

    //寻找数据最小的元素
            static void FindMinNum(int[] arry, int i)
            {
                int mosPos = i;
                for (int j = i + 1; j < arry.Length; j++)
                {
                    if (arry[j] < arry[mosPos])
                    {
                        //找到最小索引
                        mosPos = j;
                    }
                }
                Console.WriteLine("最小值的索引是:" + mosPos);
                Console.WriteLine("最小值是:" + arry[mosPos]);
                //表示有变化则替换
                if (i != mosPos)
                {
                    SwapArr(i, mosPos, arry);
                }
            }
    /// <summary>
            /// 交换数据组方法
            /// </summary>
            /// <param name="currentIndex">当前要比较交换的索引</param>
            /// <param name="mosPos">查找到命中到的最大(小)索引值</param>
            /// <param name="arr">数据源</param>
            static void SwapArr(int currentIndex, int mosPos, int[] arr) {
                var temp = arr[currentIndex];
                arr[currentIndex] = arr[mosPos];
                arr[mosPos] = temp;
            }
     //打印方法
    static void PrintCw(int[]arry) {
                for (int i = 0; i < arry.Length; i++)
                {
                    Console.WriteLine(arry[i] + "");
                }
            }
    

      打印结果如下:

     方法还可以适当优化,先学习算法思想,一步一步分解,自已要敲,调式,不是一步就写出来的.

      

     
  • 相关阅读:
    C# 把带有父子关系的数据转化为------树形结构的数据 ,以及 找出父子级关系的数据中里面的根数据Id
    基于角色的菜单按钮权限的设计及实现
    基于记忆性的中值滤波O(r)与O(1)复杂度的算法实现
    Canny算法检测边缘
    图像平滑去噪之高斯滤波器
    运动元素提取,基于帧间差分与背景差分
    基于RGB与HSI颜色模型的图像提取法
    基于阈值的灰度图像提取法
    C语言深入学习
    大津法实现图像二值化
  • 原文地址:https://www.cnblogs.com/yzenet/p/15885687.html
Copyright © 2020-2023  润新知