算法——选择排序

#include <iostream>

#include <cstdio>

using namespace std;

//选组排序

/*原理:求出第1位(包含)以后的最小值,然后把他放到第1位

        求出第2位(包含)以后的最小值,然后把他放到第2位

        以此类推执行下去

*/

int  a[9]={0,1,54,77,24,97,32,8,21,33};

int main()

{

    int m;

    for(int i=1;i<8;i++)

    {

        for(int j=i,m=i;j<8;j++)    //擂台法求出后面元素的最小值

            if(a[j]<a[m])       //用m记录最小值的位置

                m=j;            //用m记录最小值的位置

        swap(a[m],a[i]);        //swap在第二次循环的外面,所以把m设置成全局变量

    }

    return 0;

}

注意:

1.擂台法:

一、可以是记录最小值的下标,也可以是记录最小值。但在这里如果用擂台法记录最小值,达不到交换的目的(因为不知道坐标位置),这样一来较小的值的位置就没有发生变动(只是把最小值按顺序赋值给了数组),所以达不到预期效果。特别是:如果最小值恰好在最后一个,这样一来通过赋值,数组中所有的元素都成了最小值。

二、基于擂台法的原理:1.擂台法的初始站擂者(最开始站擂台的那个人)可以是按外层循环顺序来的(特别是记录坐标时),依次是a【0】,a【1】.......(因为是求他们之后的元素的最值,所以不能遗漏它自身为最值的情况)。2.擂台法的初始站擂者(最开始站擂台的那个人)也可以是自己给定的一个偏差很大的极限值(在求数组中的最值时)。比如要记录数组中的最小值,有数组a[8]={10,2,31,4,222,24,21,0},这时令minm=-2131213;依次从头扫描整个数组,也不会漏掉第一个值为最小值的情况。

2.数组元素的控制范围:

一、可以是for(int i=0;i<n;i++),也可以是for(int i=1;i<=n;i++)。一开始数组定义时设置多大以及0的初始化对后续的操作没有影响,因为for循环中会用范围来控制对数组具体的哪一部分来进行操作)

这篇文章,是又一个故事的结束...
lazy's story is continuing.
原文地址:https://www.cnblogs.com/Hello-world-hello-lazy/p/13473549.html