排序算法之选择排序

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

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

  打印结果如下:

 

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

 

  

 

 

posted @ 2022-02-12 11:04  KyrieYang  阅读(83)  评论(0编辑  收藏  举报