算法(1)

---恢复内容开始---

从开始准备学编程就一直听算法算法。算法个毛东西?今天开始我就开始准备接触算法

算法那么首先就是排序:

排序大概份四种排序:

  交换排序: 包括冒泡排序,快速排序。

选择排序: 包括直接选择排序,堆排序。

插入排序: 包括直接插入排序,希尔排序。

合并排序: 合并排序。

1.冒泡

从最开始的冒泡算法开始。

何为冒泡

---恢复内容结束---

从开始准备学编程就一直听算法算法。算法个毛东西?今天开始我就开始准备接触算法

算法那么首先就是排序:

排序大概份四种排序:

  交换排序: 包括冒泡排序,快速排序。

选择排序: 包括直接选择排序,堆排序。

插入排序: 包括直接插入排序,希尔排序。

合并排序: 合并排序。

1.冒泡

从最开始的冒泡算法开始。

何为冒泡  好比一个

50

80

90

20

从底层开始算起冒泡,20小于90,20冒泡上来,90沉下去  50,80,20,90

20小于80 重复 50,20,80,90

90大于80,不需要交换,20小于50交换:20,50,80,90

排序成功

java代码实现:

  1. package com.xiaoqiang.sort;
  2. import java.util.Arrays;
  3. public class Sort {
  4. public static void main(String[] args) {
  5. //原始数据
  6. int a[] = new int[10000];
  7. for (int i = 0; i < 10000; i++) {
  8. a[i]=(int) (Math.random()*100000);
  9. }
  10. //排序
  11. System.out.println(Arrays.toString(a));
  12. mp(a);
  13. System.out.println(Arrays.toString(a));
  14. }
  15. private static  void mp(int[] a) {
  16. //冒泡算法
  17. //首先遍历
  18. long starTime=System.currentTimeMillis();
  19. int temp;
  20. //第一层循环
  21. for (int i = 0; i < a.length-1; i++) {
  22. //length-1比较次数
  23. //j>i:从后往前的下标一定大于从前往后的下标,否则就超越了
  24. for(int j=a.length-1;j>i;j--){
  25. //如果前面一个数大于后面一个数则交换
  26. if (a[j-1]>a[j]) {
  27. temp=a[j-1];
  28. a[j-1]=a[j];
  29. a[j]=temp;
  30. }
  31. }
  32. }
  33. long endTime=System.currentTimeMillis();
  34. System.out.println(endTime-starTime);
  35. }
  36. }

运算时间:725ms

Array.sort();

自带数组排序算法:7ms巨大的差距

冒泡算法被打爆的体无完肤

快速排序:

快速排序也是一种交换算法,那么快速排序算法怎么会这么快呢?

left指针 right指针 base参照数字

思想就是通过第一遍等的遍历找到切割点,

第一步:取出参照数20

第二步:从右往左找一直找到比20小的数然后把这个数字赋值给left

此时数组为:10,40,50,10,60,

第三步:从数组的左开始找一直找到比20大的数40 赋值到right

此时数组为:10,40,50,40,60,

left和right指针分别为前后的40。

第四步:重复“第二,第三“步骤,直到left和right指针重合,

最后将(base)插入到40的位置,

此时数组值为: 10,20,50,40,60,至此完成一次排序。

第五步:此时20已经潜入到数组的内部,20的左侧一组数都比20小,20的右侧作为一组数都比20大,

以20为切入点对左右两边数按照"第一,第二,第三,第四"步骤进行,最终快排大功告成。

下面是自己实现的快速排序算法的实现:

  1. // 快速排序算法
  2. // 输入数组以及数组的第一个数序号和最后一个数序号
  3. public static void quick_sort(int s[], int l, int r) {
  4. if (l < r) {
  5. // Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
  6. int i = l, j = r, x = s[l];
  7. while (i < j) {
  8. while (i < j && s[j] >= x)
  9. // 从右向左找第一个小于x的数
  10. j--;
  11. if (i < j)
  12. s[i++] = s[j];
  13. while (i < j && s[i] < x)
  14. // 从左向右找第一个大于等于x的数
  15. i++;
  16. if (i < j)
  17. s[j--] = s[i];
  18. }
  19. s[i] = x;
  20. quick_sort(s, l, i - 1); // 递归调用
  21. quick_sort(s, i + 1, r);
  22. }
  23. }

时间大概是5ms左右跟java封装的排序算法差不多效率。

时间: 2024-10-08 06:28:56

算法(1)的相关文章

经典排序算法 - 冒泡排序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 场景 电影可以按照题材分类,那么如何区分 动作片 和 爱情片 呢? 动作片:打斗次数更多 爱情片