啊哈算法(一)

1.最快最简单的排序,桶排序

  问题:假设有5个同学,在一场考试中分别取得分数为(满分10):3  5  8  2  5,如何将他们按从大到小的顺序排列?

  解决思路:定义一个长度为11的数组,即a[0]-a[10],下标序号分别对应分数1-10;每一个人得到一个分数n,就使a[n]++,如有两个人得5分,a[5]=2;

       然后依次打印数组小标序号,对应的值为n则打印n次。

  图形解释:

                          +1

        +1      +1                           +1                                         +1

                             

   a[1]      a[2]    a[3]    a[4]    a[5]    a[6]    a7[]    a[8]   a[9]   a[10]

  代码如下:

#include <stdio.h>
int main() {
    int a[10] i j t;
    for(i=0; i<=10; i++){
        a[i]=0;               //初始化数组的每一项都为0
    }

    for(i=1; i<=5; i++){
        scanf("%d",&t);    //循环输入5个字
        a[t]++;                //对应下标的数组值+1
    }

    for(i=0; i<=10; i++){        //遍历数组,从小到大排序
        for(j=1; j<=a[i]; j++){  //确定每一项的值,出现几次就打印几次
            printf("%d",i)
        }
    }

    getchar();
    getchar();
    return 0
}    

总结:桶排序的优点是非常快速的排序;

     缺点是浪费空间,如果需要排序的数范围非常啊大:1~999999999,那么就需要申请1000000000个变量(桶)a[999999999]。

运用场景:需要知道各变量出现的次数。

2.冒泡排序

  基本思想:每次比较两个相邻的元素,如果他们的顺序错误,就把他们的位置交换。

    问题:将12  35  99  18  76 五个数进行从大到小的排序。

  解题思路:因为是从大到小排序,所以小的数应该排在后面。每次只比较两个数,判断较小的数是否在右边,否则交换位置;

       比较4次后,数组中最小的数将出现在最右边,我们称之为“归位”,这样的一系列比较结束我们称之为“一趟”;(归位 和 趟 是非常重要的概念 !)

       结束一趟后开始第二趟,比较3次,倒数第二小的数将出现在倒数第二的位置......

       如此类推。

  图形解释:两个数中的较小数会一直往上走,就像冒泡一样。

          

  代码如下:

 1 #include <stdio.h>
 2 int main(){
 3     int a[100],i,j,t,n;
 4     sca9nf("%d",&n)        //输入一个数n,表示总共有n个数需要比较
 5     for(i=0; i<=n; i++){
 6         scanf("%d",&a[i])    //将数字循环放入数组a中
 7     }
 8
 9     for(i=1; i<=n-1; i++){        //总共需要走n-1趟
10         for(j=2; j<=n-i;j++){     //每一趟比较n-i次
11             if(a[j] < a[j+1]){         //判断,若小的数在左边,则交换位置
12                 t = a[j];
13                 a[j] = a[j+1]
14                 a[j+1] = t
15             }
16         }
17     }
18
19     for(i=1; i<=n; i++){          //循环输出数组结果
20         printf("%d",a[i]);
21     }
22
23     getchar();
24     getchar();
25     return 0;
26 }

总结:冒泡排序每次只比较两个数,从数列的前两个开始

   若比较n个数,则需要进行n-1趟,共有n-1个数归位,直到最后一个未归位的数,排列才结束

   第i趟时,只需要比较n-i次,因为已经有i-1个数归位,不需要与归位的数进行比较

     冒泡排序的核心部分是双重嵌套,外层是n-1趟,内层是这一趟要进行n-i次比较

    缺点,冒泡排序时间复杂度非常高。

运用场景:对无序数列进行排序

3.快速排序

  基本思想:确定基准数K,一般为数列中的第1个数。在数列两边分别向中间进行“探索”,依据判断条件(如按顺序排列),先从右端开始,当右边某一个值大于k时,左边开始

       当左边某一值小于k时,左右两个值交换,继续探索,直到两边遍历到同一个值,将这个值与基准值k交换。

  问题:对无序数列6  1  2  7  9  3  4  5   10  8进行排序。

  解题思路: 确定基准数k(书中设为6),定义i  j两个变量,分别从数列两端(a[0]和a[9])向中间靠拢,当j<k,i>k时,将a[i]和a[j]交换。

        若是降序,判断条件改为,当j>k,i<k时,将a[i]和a[j]交换。

  图形解释:

      k  i                              j

      6 1  2  7  9 3  4  5  10  8

      k  i                         j

      6 1  2  7  9 3  4  5  10  8

   k  i                     j                       此时j<k,i开始遍历

      6 1  2  7  9 3  4  5  10  8

      k     i                  j

      6 1  2  7  9 3  4  5  10  8

k         i              j

      6 1  2  7  9 3  4  5  10  8            变量i找到了比基准值大的数,满足j<k,i>k,将两个数交换

   

            k         i              j

6 1  2  5  9 3  4  7  10  8    

k        i      j

6 1  2  5  4 3  9  7  10  8

k                i/j

        6 1  2  5  4  3  9  7  10  8         最后,i 和 j 相遇,则将它和基准值交换  k <==> i/j

3 1  2  5  4  6  9  7  10  8         这数最后的结果

  然后我们将6的左边和右边继续使用同样的方法进行排序即可。

时间: 2024-11-08 19:08:11

啊哈算法(一)的相关文章

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

转载:DenseNet算法详解

原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h

基于位置信息的聚类算法介绍及模型选择

百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的

密码算法详解——AES

0 AES简介 美国国家标准技术研究所在2001年发布了高级加密标准(AES).AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准. 根据使用的密码长度,AES最常见的有3种方案,用以适应不同的场景要求,分别是AES-128.AES-192和AES-256.本文主要对AES-128进行介绍,另外两种的思路基本一样,只是轮数会适当增加. 1 算法流程 AES加解密的流程图如下: AES加密过程涉及到4种操作:字节替代(SubBytes).行移位(ShiftRows).列混淆(MixCo

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

关于SVM数学细节逻辑的个人理解(三) :SMO算法理解

第三部分:SMO算法的个人理解 接下来的这部分我觉得是最难理解的?而且计算也是最难得,就是SMO算法. SMO算法就是帮助我们求解: s.t.   这个优化问题的. 虽然这个优化问题只剩下了α这一个变量,但是别忘了α是一个向量,有m个αi等着我们去优化,所以还是很麻烦,所以大神提出了SMO算法来解决这个优化问题. 关于SMO最好的资料还是论文<Sequential Minimal Optimization A Fast Algorithm for Training Support Vector

基于Spark MLlib平台的协同过滤算法---电影推荐系统

基于Spark MLlib平台的协同过滤算法---电影推荐系统 又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用.其中,主要包括三部分内容: 协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,

算法 希尔排序

希尔排序 Shell Sort 介绍: 希尔排序(Shell Sort)也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高. 执行流程: 首先

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"

【机器学习实战】第2章 K-近邻算法(k-NearestNeighbor,KNN)

第2章 k-近邻算法 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script> KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法主要是用来进行分类的. KNN 场景 电影可以按照题材分类,那么如何区分 动作片 和 爱情片 呢? 动作片:打斗次数更多 爱情片