• 算法——选择排序


    #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.
  • 相关阅读:
    简单字符串处理应避免使用正则表达式
    提高正则表达式的可读性
    用零宽度断言匹配字符串中的特定位置
    避免不必要的回溯
    预编译正则表达式
    用Text::CSV_XS模块处理csv文件
    Ack 类似grep一样的查找
    Apache压力测试
    仅编译正则表达式一次
    排序上下箭头的是实现
  • 原文地址:https://www.cnblogs.com/Hello-world-hello-lazy/p/13473549.html
Copyright © 2020-2023  润新知