Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157628
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-23 15:21
文章分类

全部博文(66)

文章存档

2016年(66)

我的朋友

分类: LINUX

2016-06-03 16:00:59

顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完, 再简单点,对着一群数组说,你们谁最小出列, 站到最后边,然后继续对剩余的无序数组说,你们谁最小出列,站到最后边

再继续刚才的操作,一直到最后一个,继续站到最后边,现在数组有序了,从小到大



举例

先说看每步的状态变化,后边介绍细节,现有无序数组[6 2 4 1 5 9]


第一趟找到最小数1,放到最前边(与首位数字交换)

交换前:| 6 | 2 | 4 | 1 | 5 | 9 |
交换后:| 1 | 2 | 4 | 6 | 5 | 9 |


第二趟找到余下数字[2 4 6 5 9]里的最小数2,与当前数组的首位数字进行交换,实际没有交换,本来就在首位

交换前:| 1 | 2 | 4 | 6 | 5 | 9 |
交换后:| 1 | 2 | 4 | 6 | 5 | 9 |


第三趟继续找到剩余[4 6 5 9]数字里的最小数4,实际没有交换,4待首位置无须交换


第四趟从剩余的[6 5 9]里找到最小数5,与首位数字6交换位置

交换前:| 1 | 2 | 4 | 6 | 5 | 9 |
交换后:| 1 | 2 | 4 | 5 | 6 | 9 |


第五趟从剩余的[6 9]里找到最小数6,发现它待在正确的位置,没有交换


排序完毕输出正确结果[1 2 4 5 6 9]




第一趟找到最小数1的细节


当前数组是| 6 | 2 | 4 | 1 | 5 | 9 |


先把6取出来,让它扮演最小数


当前最小数6与其它数一一进行比较,发现更小数就交换角色


当前最小数6与2比较,发现更小数,交换角色,此时最小数是2,接下来2与剩余数字比较


当前最小数2与4比较,不动


当前最小数2与1比较,发现更小数,交换角色,此时最小数是1,接下来1与剩余数字比较


当前最小数1与5比较,不动


当前最小数1与9比较,不动,到达末尾


当前最小数1与当前首位数字进行位置交换,如下所示


交换前:| 6 | 2 | 4 | 1 | 5 | 9 |


交换后:| 1 | 2 | 4 | 6 | 5 | 9 |


完成一趟排序,其余步骤类似



例子代码:
static void selection_sort( int[] unsorted )
{
    for (int i = 0; i < unsorted.Length; i++)   
    {

        int min = unsorted[i], min_index = i;       //先初始化第一个开始比较的数为最小值

        for (int j = i; j < unsorted.Length; j++)
        {
            if (unsorted[j] < min)                        //若是找到比初始化min更小的值, 那么就记录该值和索引
            {
                min = unsorted[j];
                min_index = j;
            }
        }
        if (min_index != i)          //若不是第一个开始比较值,那么就需要移位
        {
            int temp = unsorted[i];
            unsorted[i] = unsorted[min_index];
            unsorted[min_index] = temp;
        }
    }
}




阅读(1160) | 评论(0) | 转发(0) |
0

上一篇:冒泡排序

下一篇:没有了

给主人留下些什么吧!~~