算法学习
算法学习
QtHalcon
大学一直做嵌入式和音视频方向的开发,熟悉Linux,毕业转到了CV方向,现在在深圳从事计算机视觉的工作。
展开
-
简单算法小技巧
巧用数组下标 数组的下标是一个隐含的很有用的数组,特别是在统计一些数字,或者判断一些整型数是否出现过的时候。例如,给你一串字母,让你判断这些字母出现的次数时,我们就可以把这些字母作为下标,在遍历的时候,如果字母a遍历到,则arr[a]就可以加1了,即arr[a]++。通过这种巧用下标的方法,我们不需要逐个字母去判断。我再举个例子:问题:给你n个无序的int整型...原创 2018-12-13 22:48:25 · 206 阅读 · 0 评论 -
排序算法(八):桶排序/基数排序(Radix Sort)
说基数排序之前,我们先说桶排序:基本思想:是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。 简单来说,就是把数据分组,放在一个个的桶中,...原创 2018-11-26 19:01:07 · 654 阅读 · 0 评论 -
排序算法(七):归并排序(Merge Sort)
基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序示例: 合并方法:设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。j=m+1;k=i;i=i; //置两个子表的起始下标及辅助数组的...原创 2018-11-26 18:46:44 · 383 阅读 · 1 评论 -
排序算法(六):快速排序(Quick Sort)
基本思想:1)选择一个基准元素,通常选择第一个元素或者最后一个元素,2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。3)此时基准元素在其排好序后的正确位置4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。快速排序的示例: 算法的实现: 递归实现:#i...原创 2018-11-26 13:40:19 · 469 阅读 · 0 评论 -
排序算法(五):冒泡排序(Bubble Sort)
基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。冒泡排序的示例:算法的实现:public void bubbleSort(int[] a) { for(int i = a.length - 1; i >...原创 2018-11-26 10:58:33 · 946 阅读 · 0 评论 -
时间复杂度和空间复杂度
时间复杂度 首先我们先来说时间效率的这个问题,这里的时间效率就是指的算法的执行时间,时间的快慢本来就是一个相对的概念,那么到了算法上,我们该用怎样的度量指标去度量一个算法的时间效率(执行时间)呢? 刚开始我们想出了一种事后统计方法,我称它为「马后炮式」,顾名思义,就是对于要解决的某个问题,费尽心思想了 n 种解法,提前写好算法程序,然后攒了一堆数据,让它们分别在电脑上跑,跑完了然后...转载 2018-11-25 09:32:11 · 172 阅读 · 0 评论 -
排序算法(四):堆排序(Heap Sort)
堆排序是一种树形选择排序,是对直接选择排序的有效改进。基本思想:堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足时称之为堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最小项(小顶堆)。 若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的。如:(a)大顶堆序列:...原创 2018-11-26 10:18:56 · 343 阅读 · 0 评论 -
排序算法(三):简单选择排序(Simple Selection Sort)
基本思想:在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。简单选择排序的示例:操作方法:第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录...原创 2018-11-26 09:55:53 · 691 阅读 · 0 评论 -
冒泡排序的优化
普通的冒泡排序就是这样:public void bubbleSort(int[] a) { for(int i = a.length - 1; i > 0; i--) { for(int j = 0; j < i; j++) { if(a[j] > a[j+1]) //交换,具体实现略 ...原创 2018-11-25 08:42:34 · 220 阅读 · 0 评论 -
九大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;十大经典排序算法(动图演...原创 2018-11-25 22:38:11 · 2815 阅读 · 0 评论 -
排序算法(二):希尔排序
希尔排序是1959 年由D.L.Shell 提出来的,相对直接插入排序有较大的改进。希尔排序又叫缩小增量排序基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。操作方法:选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 按增量序列个数k,对序列进行k 趟排序; ...原创 2018-11-25 22:29:44 · 374 阅读 · 0 评论 -
排序算法(一):直接插入排序
1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。要点:设立哨兵,作为临时存储和判断数组边界之用。直接插入排序示例:如果碰见一个和插入元素相等的,那么插入元素把想插入...原创 2018-11-25 22:26:11 · 464 阅读 · 0 评论 -
A*算法学习
A*算法=Dijkstra算法 + BFS算法它把Dijkstra算法(靠近初始点的结点)和BFS算法(靠近目标点的结点)的信息块结合起来。在讨论A*的标准术语中,g(n)表示从 初始结点 ~ 结点n 的代价 h(n)表示从 结点n ~ 目标点 的 预计代价(不是精确的值)在上图中,yellow(h)表示远离目标的结点 teal(g)表示远离初始...原创 2019-05-15 08:54:04 · 616 阅读 · 0 评论