[算法天天练]选择排序法

#include<stdio.h>voidshow(intarr[],intlength){for(inti=0;i<length;i++){printf("%d",arr[i]);}printf("");}void_swap(int*a,int*b){inttmp=*a;*a=*b;*b=tmp;}voidSelectSort(intarr[],intlength){size_ti,j;intmin;for(i=0;i<length-1;i++){//假设arr[i]为最小的数min=arr[i];//通过循环获取数组中剩余数中的最小数for(j=i+1;j<length;j++){if(min>arr[j]){_swap(&min,&arr[j]);}}//将最小的数放到正确的位置if(arr[i]!=min){_swap(&arr[i],&min);}}}intmain(){intarr[10]={2,1,5,4,3,9,8,7,6,0};SelectSort(arr,10);show(arr,10);retur...

[算法天天练]插入排序算法

#include<stdio.h>voidshow(intarr[],intlength){for(inti=0;i<length;i++){printf("%d",arr[i]);}printf("");}voids_insert(intarr[],intlength){if(length<0)return;for(inti=1;i<length;i++){intk=i;for(intj=0;j<i;j++){if(arr[j]<arr[k]){intt=arr[j];arr[j]=arr[k];arr[k]=t;}}}}intmain(){intarr[10]={2,1,5,4,3,9,8,7,6,0};s_insert(arr,10);show(arr,10);return0;}  ...

[算法天天练] 归并排序

要实现归并排序递归方法:第一步:先将原来的数据表分成排好序的子表,然后调用合并函数对子表进行归并,使之成为有序表例如有如下向量:⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾25,10,7,19,3,48,12,17,56,30,21/25,10,7,19,348,12,17,56,30,21//25,107,19,348,12,1756,30,21////2510719,3............ 归并算法划分子表和归并子表与原数据序列次序无关,因此算法最坏情况,最坏情况和平均情况时间复杂度是一样的,时间复杂度为O(NlogN),空间复杂度O(N+logN)#include<stdio.h>#include<stdlib.h>voidMerge(intarr[],intbeg,intmid,intend){inti=beg;intj=mid+1;intp=0;int*ipa;ipa=(int*)malloc((end-beg+1)*sizeof(int));if(!ipa)return;while(i<=mid&&j<=end){//ipa[p+...

[算法天天练]快速排序

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,作为面试题来考试。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。以一个数组作为示例,取区间第一个数为基准数。01234567897265788604283734885初始时,i=0; j=9;  X=a[i]=72由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8];i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3];j--; #include<stdio.h>voidQuickSo...

【转帖】常见的排序算法

 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序、选择排序、交换排序、归并排序、分配排序和计数排序。插入排序主要包括直接插入排序,折半插入排序和希尔排序两种;选择排序主要包括直接选择排序和堆排序;交换排序主要包括冒泡排序快速排序;归并排序主要包括二路归并(常用的归并排序)和自然归并。分配排序主要包括箱排序和基数排序。计数排序就一种。稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。其中冒泡,插入,基数,归并属于稳定排序;选择,快速,希尔,堆属于不稳定排序。 下面是对这些常见排序算法的介绍。未来测试代码的正确性,我们采取了随机生成10个序列,然后先使用C++STL中给出的排序算法sort来得到一个正确的排序,然后再使用我们的方...

[算法天天练]冒泡排序

/**冒泡排序*核心原来:每次比较两个相邻的元素,如果它们的顺序不符合要求就把它们交换*每趟只能确定一个数归位*冒泡算法的时间复杂度为O(N*N),除了名字有点儿意思外,确实效率不高*/voidBubbleSort(intarray[],intlength){  inttmp;  for(i=0;i<length-1;i++)  {    for(j=0;j<length-i-1;j++)//这里是冒泡的核心,手动画图一目了然    {      if(array[j]>array[j+1])//调整大于号,小于号即可调整从大到小,从小到大的顺序      {        tmp=a[j];        a[j]=a[j+1];        a[j+1]=tmp;      }    }  }}  ...

[算法天天练]桶排序

【问题】:如果有一组数据a[]={0,9,2,3,4,5,3,5,2,8},对它进行从小到大的顺序排列 #include<stdio.h>voidBucketSort(){inti,j;inta[]={0,9,2,3,4,5,3,5,2,8};intb[10]={0};intiaSize=sizeof(a)/sizeof(int);intibSize=sizeof(b)/sizeof(int);for(i=0;i<iaSize;i++){b[a[i]]++;}for(i=0;i<iaSize;i++){for(j=0;j<b[i];j++){printf("%d",i);}}printf("");}intmain(){BucketSort();}  说一下复杂度的问题,桶排的复杂度O(m+n),其中m表示桶的个数,n表示待排序数的个数,即表示为O(M+N)....
IT猿 IT猿·2020-03-27

[算法天天练]关于单链表的操作有环无环判断

#include<stdio.h>#include<stdlib.h>//有环链表的各种函数测试typedefstructNode{intdata;structNode*next;}Node;typedefstructNode*LinkList;/*链表初始化*/intInitList(LinkList*L){*L=(LinkList)malloc(sizeof(Node));if(!(*L))return-1;(*L)->next=NULL;return0;}/*求链表的长度*/intListLength(LinkListL){inti=0;LinkListp=L->next;while(p){i++;p=p->next;}returni;}intCreateListHead(LinkList*L,intn){LinkListp;inti;for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(Node));p->data=i+1;p->next=(*L)->next;(*L)->n...

[算法天天练]

双向链表是比较常见的,主要是在链表的基础上添加prev指针,闲话少说直接上代码吧(这个也是网上一个大神的思路,真心不错,条理清楚,逻辑缜密)主要也是为了学习,贴上我所调试成功的代码(Linux环境下)双向链表代码:1#include<stdio.h>2#include<stdlib.h>34typedefstructNodeTagNode;5typedefstructLinkedListTagLinkedList;67structNodeTag8{9Node*prev;10Node*next;11void*data;12};1314structLinkedListTag15{16Node*head;17Node*tail;18Node*cur;19intsize;20};2122//创建一个链表成功返回该链表的指针否则返回NULL23LinkedList*Create(void)24{25//创建一个新节点26LinkedList*list=(LinkedList*)malloc(sizeof(LinkedList));27//创建不成功,返回NULL28if(...
IT猿 IT猿·2020-03-27

最短路径之Floyd算法

Floyd算法又称弗洛伊德算法,也叫做Floyd'salgorithm,Roy–Warshallalgorithm,Roy–Floydalgorithm, WFIalgorithm。Floyd算法是一种在有权图中(有确定的非负的权值,不能存在环路)查找最短路径的算法。该算法的一次简单执行可以找出任意结点之间的最短路径(尽管它没有返回路径的具体信息)。思想:Floyd算法通过比较图中任意两点间所有可能存在的路径长度得到最短路径长度。我们定义一个函数shortestPath(i,j,k)代表从结点i到结点j的最短路径且路径上所有结点的编号均小于k。两结点间最短路径只有两种情况:1、从结点i经过若干编号小于k的结点到达结点j;2、从结点i经过若干编号小于k+1的结点到达结点j。其中若最短路径为第二种情况,则此事路径可以分割为两段:从结点i到结点k+1和从结点k+1到结点j,其中从结点i到结点k+1为最短路径,从结点k+1到结点j也为最短路径。我们定义w(i,j)为结点i到结点j的边的距离,如果两结点之间没有变则w(i,j)为无穷大。那么以下等式shortPa...

Detectron系统实现了最先进的物体检测算法https://github.com/facebookresearch/Detectron

 ,包括MaskR-CNN。它是用Python编写的,支持Caffe2深度学习框架。 不久前,FAIR才开源了语音识别的工具wav2letter,戳这里看大数据文摘介绍《快讯|Facebook开源语音识别工具包wav2letter》。这一系列工具的开源,将使更多研究人员能使用到Facebook的平台,进一步扩大Facebook人工智能实验室的影响力。针对Detectron的开源,研究员RossGirshick发表了一篇博客,具体介绍了该开源平台的性能。 Detectron项目于2016年7月启动,旨在创建一个基于Caffe2的快速、灵活的物体检测系统。经过一年半的发展,Detectron的代码库已趋于成熟,并支持了很多内部项目,比如:MaskR-CNN和FocalLossforDenseObjectDetection(ICCV2017-Marr奖项和最佳学生论文获奖项目)。 Detectron支持的算法为计算机视觉关键任务(比如实例分割)提供了直观的模型,并在近年来社会上取得的视觉感知系统的巨大成果中发挥了关键作用。除了研究,Facebook许多...

搜索引擎算法研究专题六:HITS算法

2017年12月19日 ⁄ 搜索技术 ⁄共1240字⁄字号 小 中 大 ⁄ 评论关闭 HITS(Hyperlink-InducedTopicSearch)是由Kleinberg在90年代末提出的基于链接分析的网页排名算法。该算法与查询相关。  用HITS算法评估网页质量,可得到内容权威度(Authority)和链接权威度(Hub)。内容权威度与网页自身直接提供内容信息的质量相关,网页被引用得越多,其内容权威度越高;而链接权威度与网页提供的超链接的质量相关,引用内容质量高的网页越多,网页的链接权威度越高。  一个好中心网页应该指向很多权威性网页,而一个好的权威性网页则应该被很多好的中心性网页所指向。对整个Web集合而言,Authority和Hub是相互依赖、相互加强、相互优化的关系,这是HITS算法的基础。  HITS算法的施行是“迭代—收敛”的过程,即网页A链接权威度的数值是通过其链向的网页的内容权威度决定的,而网...

搜索引擎算法研究专题五:TF-IDF详解

2017年12月19日 ⁄ 搜索技术 ⁄共1396字⁄字号 小 中 大 ⁄ 评论关闭 TF-IDF(termfrequency–inversedocumentfrequency)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随著它在文件中出现的次数成正比增加,但同时会随著它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。  TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF*IDF,TF词频(TermFrequency),IDF反文档频...

搜索引擎算法研究专题七:Hilltop算法

2017年12月19日 ⁄ 搜索技术 ⁄共1256字⁄字号 小 中 大 ⁄ 评论关闭 HillTop也是搜索引擎结果排序的专利,是Google工程师Bharat在2001年发明的。Google的排序规则经常在变化,但变化最大的一次也就是2003年的基于HillTop算法的优化。  HillTop算法的指导思想和PageRank的一致,都通过网页被链接的数量和质量来确定搜索结果的排序权重。但HillTop认为只计算来自具有相同主题的相关文档链接对于搜索者的价值会更大:即主题相关网页之间的链接对于权重计算的贡献比主题不相关的链接价值要更高。Bharat称这种对主题有影响的文档为“专家”文档,从这些专家文档页面到目标文档的链接决定被链接网页的权重值。  Hilltop算法定义一个网站与其它网站的相关性,作为识别跨站点的链接交换干扰与识别相似链接的技术,以杜绝那些想通过任意链接来扰乱排名规则、那些想通过增加无效链接来提高网页PageR...

搜索引擎算法研究专题四:随机冲浪模型介绍

2017年12月19日 ⁄ 搜索技术 ⁄共2490字⁄字号 小 中 大 ⁄ 评论关闭 Google的LawrencePage和SergeyBrin为PageRank(PR)算法给出了一个非常简单直观的解释。他们将PageRank视作一种模型,就是用户不关心网页内容而随机点击链接。  网页的PageRank值决定了随机访问到这个页面的概率。用户点击页面内的链接的概率,完全由页面上链接数量的多少决定的,这也是上面PR(Ti)/C(Ti)的原因。  因此,一个页面通过随机冲浪到达的概率就是链入它的别的页面上的链接的被点击概率的和。并且,阻尼系数d减低了这个概率。阻尼系数d的引入,是因为用户不可能无限的点击链接,常常因无聊而随机跳入另一个页面。  阻尼系数d定义为用户不断随机点击链接的概率,所以,它取决于点击的次数,被设定为0-1之间。d的值越高,继续点击链接的概率就越大。因此,用户停止点击并随机冲浪至另一页面的概率在式子中用常数(1-d)表示。无论入站链接...
首页上一页...131132133134135下一页尾页