C# 直接选择排序(史上最清晰,最通俗)

public void SelectSort(int[] array)
{
  int len = array.Length;
  int minValIndex; //无序区中最小值的索引
  int i; //无序区的第一个值的索引
  int j; //无序区中的值索引

  //最后一轮不用比了,无论怎么都是最小的了(len-1)
  for (i = 0; i < len-1; i++)
  {
    //将无序区中的第一个值的索引记录下来,作为内层循环中的第一步的对比参照
    minValIndex = i;
    for (j = i+1; j < len; j++)
    {
      //开始对无序区进行比较,将小的排在前面
      if (array[j] < array[minValIndex])
      minValIndex = j;
    }

    // 如果发现无序区中的最小值不是在它的第一位,那么将最小值和第一个值交换位置,那么无序区的第一位成了无序区的最小值
    //i=0,无序区为整个array(0 len),通过比较,这一轮得出整个array的最小值
    //i=1, 无序区缩小(1-len),通过比较,这一轮得出次小值
    //......
    //i=len-1,最后一轮比较完毕,array排序完成。

    if (minValIndex != i)
    {
      int temp = array[i];
      array[i] = array[minValIndex];
      array[minValIndex] = temp;
    }
  }

}

  一切的算法都可以通过它的表现形式的帮助来得到理解可以将这种排序,反应到生活中。

  比如要从你们班中找出最猥琐的人,那么我们开始之前要做的是:全班同学排成一列,并准备好一个令牌,这个令牌用来记录这是第几轮选拔,和这轮选拔中得出的最猥琐者站在哪个位置。

  第一轮选拔开始鸟,首先,往令牌上记录好这是第一轮选拔,我在令牌的第一个格子里面填上”1“,从排头开始,将他和他后面的同学进行逐一比较,比较到第三位同学的时候,发现次同学蓬头垢面,不修边幅,哥哥毫不犹豫将牌牌贴到此同学的背背上,此同学立即满眼怒火向哥喷来,“嘿,哥们,不要这样嘛”,这一轮还未选拔完呢,全班最猥琐不一定是你噢!",我奸诈地吐槽道,然后转身,继续对他后面的同学进行审核,去到第14个位置的时候,我惊呆了,额的神噢,我们班原来还有这等极品啊,脑子里立马闪出的时候《喜剧之王》里面那个被学生们“张柏芝”侍候的那位兄台,满口黑牙,一脸淫笑,鼻子里面还藏着数根虫虫,哇靠,第一非你莫属了。为了选拔的严谨性,我还是例行对他后面的同学进行了一遍走马观花式的选拔,然后冲回到那位极品的旁边,“哥,你当老二,没人敢当老大了,你站到第一个位置,叫那个同学过来你这个位置吧”,说完,我忘令牌的第二个格子里面填上”14“,他就屁颠屁颠地按着我的说法去做了,哈,看来极品就是极品,连动作都如此匹配,耶,第一轮选拔完毕。

  第二轮开始:首先要做的还是”令牌“,抹掉第一轮的记录。这是第二轮哈,所以令牌要记上2,最猥琐的同学暂时为,这一轮的第一位同学,他站在第二个位置上,所以令牌的第二个格子填上”2“先,通过一番对比,发现了站在第7位的同学为这一轮的”幸运儿“,我将他的站位写在令牌的第二个格子上。记着就是和第一轮那个极品同样的操作,完成了次极品的选拔。

。。。

。。。

。。。

  还剩两位同学,慧眼一看,高下立分,change position。选拔完成

原文地址:https://www.cnblogs.com/Ellfelo/p/Ellfio.html