• 排序算法之选择排序


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

    选择排序是一种简单直观的排序算法,无论什么数据进去都是 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] + "");
                }
            }
    

      打印结果如下:

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

      

     
  • 相关阅读:
    FTP服务总结
    编译安装hpptd2.4
    搭建DNS服务
    定制简单的Linux系统
    建立私有CA
    关于/boot文件的修复实验
    shell脚本进阶(二)
    datetime模块日期转换和列表sorted排序
    linux操作命令
    Python 中的特殊双下划线方法
  • 原文地址:https://www.cnblogs.com/yzenet/p/15885687.html
Copyright © 2020-2023  润新知