当前位置:首页 > 数码 > 程序开发中罕用的十种算法-你用过几种 (程序开发中罕见的语言)

程序开发中罕用的十种算法-你用过几种 (程序开发中罕见的语言)

admin1个月前 (04-20)数码8

当编写程序时,了解和经常使用不同的算法对处置疑问至关关键。以下是C#中罕用的10种算法,每个算法都随同着示例代码和详细说明。

1.冒泡排序(BubbleSort):

冒泡排序是一种便捷的比拟排序算法,它屡次遍历数组,将较大的元素逐渐浮动到数组的末尾。

publicstaticvoidBubbleSort(int[]arr){intn=arr.Length;for(inti=0;i<n-1;i++){for(intj=0;j<n-i-1;j++){if(arr[j]>arr[j+1]){inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}

2.极速排序(QuickSort):

极速排序是一种高效的分治排序算法,它经过选用一个基准元素并将数组分为较小和较大的两局部来启动排序。

publicstaticvoidQuickSort(int[]arr,intlow,inthigh){if(low<high){intpartitionIndex=Partition(arr,low,high);QuickSort(arr,low,partitionIndex-1);QuickSort(arr,partitionIndex+1,high);}}publicstaticintPartition(int[]arr,intlow,inthigh){intpivot=arr[high];inti=low-1;for(intj=low;j<high;j++){if(arr[j]<pivot){i++;inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}}intswap=arr[i+1];arr[i+1]=arr[high];arr[high]=swap;returni+1;}
程序开发中罕见的语言

3.兼并排序(MergeSort):

兼并排序是一种稳固的分治排序算法,它将数组分红两半,区分排序后再兼并。

publicstaticvoidMergeSort(int[]arr){intn=arr.Length;if(n>1){intmid=n/2;int[]left=newint[mid];int[]right=newint[n-mid];for(inti=0;i<mid;i++)left[i]=arr[i];for(inti=mid;i<n;i++)right[i-mid]=arr[i];MergeSort(left);MergeSort(right);inti=0,j=0,k=0;while(i<mid&&j<(n-mid)){if(left[i]<right[j])arr[k++]=left[i++];elsearr[k++]=right[j++];}while(i<mid)arr[k++]=left[i++];while(j<(n-mid))arr[k++]=right[j++];}}

4.二分查找(BinarySearch):

二分查找是一种高效的查找算法,它要求在有序数组中查找特定元素。

publicstaticintBinarySearch(int[]arr,inttarget){intlow=0,high=arr.Length-1;while(low<=high){intmid=(low+high)/2;if(arr[mid]==target)returnmid;elseif(arr[mid]<target)low=mid+1;elsehigh=mid-1;}return-1;}

5.深度优先搜查(Depth-FirstSearch,DFS):

DFS是一种图遍历算法,它从起始节点开局,沿着门路尽或者深化,而后前往并继续搜查。

usingSystem;usingSystem.Collections.Generic;publicclassGraph{privateintV;privateList<int>[]adj;publicGraph(intv){V=v;adj=newList<int>[v];for(inti=0;i<v;i++)adj[i]=newList<int>();}publicvoidAddEdge(intv,intw){adj[v].Add(w);}publicvoidDFS(intv){bool[]visited=newbool[V];DFSUtil(v,visited);}privatevoidDFSUtil(intv,bool[]visited){visited[v]=true;Console.Write(v+"");foreach(varninadj[v]){if(!visited[n])DFSUtil(n,visited);}}}

6.广度优先搜查(Breadth-FirstSearch,BFS):

BFS是一种图遍历算法,它从起始节点开局,逐层遍历,先访问一切相邻的节点,而后再逐层裁减。

usingSystem;usingSystem.Collections.Generic;publicclassGraph{privateintV;privateList<int>[]adj;publicGraph(intv){V=v;adj=newList<int>[v];for(inti=0;i<v;i++)adj[i]=newList<int>();}publicvoidAddEdge(intv,intw){adj[v].Add(w);}publicvoidBFS(ints){bool[]visited=newbool[V];Queue<int>queue=newQueue<int>();visited[s]=true;queue.Enqueue(s);while(queue.Count!=0){s=queue.Dequeue();Console.Write(s+"");foreach(varninadj[s]){if(!visited[n]){visited[n]=true;queue.Enqueue(n);}}}}}

7.Dijkstra算法:

Dijkstra算法是一种用于查找图中最短门路的算法。

publicclassDijkstra{privatestaticintV=9;privateintMinDistance(int[]dist,bool[]sptSet){intmin=int.MaxValue;intminIndex=0;for(intv=0;v<V;v++){if(!sptSet[v]&&dist[v]<=min){min=dist[v];minIndex=v;}}returnminIndex;}privatevoidPrintSolution(int[]dist){Console.WriteLine("VertextDistancefromSource");for(inti=0;i<V;i++){Console.WriteLine(i+"t"+dist[i]);}}publicvoidFindShortestPath(int[,]graph,intsrc){int[]dist=newint[V];bool[]sptSet=newbool[V];for(inti=0;i<V;i++){dist[i]=int.MaxValue;sptSet[i]=false;}dist[src]=0;for(intcount=0;count<V-1;count++){intu=MinDistance(dist,sptSet);sptSet[u]=true;for(intv=0;v<V;v++){if(!sptSet[v]&&graph[u,v]!=0&&dist[u]!=int.MaxValue&&dist[u]+graph[u,v]<dist[v]){dist[v]=dist[u]+graph[u,v];}}}PrintSolution(dist);}}

8.最小生成树(MinimumSpanningTree,MST)-Prim算法:

Prim算法用于找到图的最小生成树,它从一个初始顶点开局,逐渐裁减生成树。

publicclassPrimMST{privatestaticintV=5;privateintMinKey(int[]key,bool[]mstSet){intmin=int.MaxValue;intminIndex=0;for(intv=0;v<V;v++){if(!mstSet[v]&&key[v]<min){min=key[v];minIndex=v;}}returnminIndex;}privatevoidPrintMST(int[]parent,int[,]graph){Console.WriteLine("EdgetWeight");for(inti=1;i<V;i++){Console.WriteLine(parent[i]+"-"+i+"t"+graph[i,parent[i]]);}}publicvoidFindMST(int[,]graph){int[]parent=newint[V];int[]key=newint[V];bool[]mstSet=newbool[V];for(inti=0;i<V;i++){key[i]=int.MaxValue;mstSet[i]=false;}key[0]=0;parent[0]=-1;for(intcount=0;count<V-1;count++){intu=MinKey(key,mstSet);mstSet[u]=true;for(intv=0;v<V;v++){if(graph[u,v]!=0&&!mstSet[v]&&graph[u,v]<key[v]){parent[v]=u;key[v]=graph[u,v];}}}PrintMST(parent,graph);}}

9.最小生成树(MinimumSpanningTree,MST)-Kruskal算法:

Kruskal算法也用于找到图的最小生成树,它基于边的权重排序。

usingSystem;usingSystem.Collections.Generic;publicclassGraph{privateintV,E;privateList<Edge>edges;publicGraph(intv,inte){V=v;E=e;edges=newList<Edge>(e);}publicvoidAddEdge(intsrc,intdest,intweight){edges.Add(newEdge(src,dest,weight));}publicvoidKruskalMST(){edges.Sort();int[]parent=newint[V];int[]rank=newint[V];for(inti=0;i<V;i++){parent[i]=i;rank[i]=0;}inti=0;inte=0;List<Edge>mst=newList<Edge>();while(e<V-1){EdgenextEdge=edges[i++];intx=Find(parent,nextEdge.src);inty=Find(parent,nextEdge.dest);if(x!=y){mst.Add(nextEdge);Union(parent,rank,x,y);e++;}}Console.WriteLine("EdgesinMinimumSpanningTree:");foreach(varedgeinmst){Console.WriteLine($"{edge.src}-{edge.dest}withweight{edge.weight}");}}privateintFind(int[]parent,inti){if(parent[i]==i)returni;returnFind(parent,parent[i]);}privatevoidUnion(int[]parent,int[]rank,intx,inty){intxRoot=Find(parent,x);intyRoot=Find(parent,y);if(rank[xRoot]<rank[yRoot])parent[xRoot]=yRoot;elseif(rank[xRoot]>rank[yRoot])parent[yRoot]=xRoot;else{parent[yRoot]=xRoot;rank[xRoot]++;}}}publicclassEdge:IComparable<Edge>{publicintsrc,dest,weight;publicEdge(intsrc,intdest,intweight){this.src=src;this.dest=dest;this.weight=weight;}publicintCompareTo(Edgeother){returnweight-other.weight;}}

10.Floyd-Warshall算法是一种用于处置一切点对最短门路的灵活布局算法。

上方是C#中的Floyd-Warshall算法的成功示例:

usingSystem;classFloydWarshall{privatestaticintINF=int.MaxValue;//代表无量大的值publicstaticvoidFindShortestPath(int[,]graph){intV=graph.GetLength(0);//创立一个二维数组dist,用于保留最短门路的长度int[,]dist=newint[V,V];//初始化dist数组for(inti=0;i<V;i++){for(intj=0;j<V;j++){dist[i,j]=graph[i,j];}}//一一顶点思索,假设经过k顶点门路比原门路短,就降级dist数组for(intk=0;k<V;k++){for(inti=0;i<V;i++){for(intj=0;j<V;j++){if(dist[i,k]!=INF&&dist[k,j]!=INF&&dist[i,k]+dist[k,j]<dist[i,j]){dist[i,j]=dist[i,k]+dist[k,j];}}}}//输入最短门路矩阵Console.WriteLine("最短门路矩阵:");for(inti=0;i<V;i++){for(intj=0;j<V;j++){if(dist[i,j]==INF)Console.Write("INFt");elseConsole.Write(dist[i,j]+"t");}Console.WriteLine();}}staticvoidMn(string[]args){intV=4;//顶点数int[,]graph={{0,5,INF,10},{INF,0,3,INF},{INF,INF,0,1},{INF,INF,INF,0}};FindShortestPath(graph);}}

在这个示例中,我们经常使用Floyd-Warshall算法来计算给定图的最短门路矩阵。该算法经过思索一一两边顶点k,始终降级最短门路矩阵dist。最终,我们可以取得一切点对之间的最短门路长度。


算法的描述方法有哪几种

算法的描述方法如下:

1、自然语言描述法:这是最直观、最常用的一种描述方法,它用人们日常使用的语言来描述算法的步骤和过程。这种方法通俗易懂,但可能会存在歧义,不够精确。流程图描述法:流程图是一种图形化的算法描述方法,它通过一系列的图形符号来表示算法的步骤和过程。

2、N-S图描述法:N-S图是另一种图形化的算法描述方法,它通过一系列的方框和箭头来表示算法的步骤和过程。PDL描述法:PDL(Program Design Language)是一种形式化的描述方法,它用一种特殊的语言来描述算法的步骤和过程。PDL严谨精确,但学习和使用难度较大。

3、伪代码描述法:伪代码是一种介于自然语言和编程语言之间的描述方法,它用类似于编程语言的语法来描述算法的步骤和过程。伪代码既具有自然语言的可读性,又具有编程语言的精确性。

4、矩阵描述法:矩阵描述法是一种数学化的描述方法,它通过一系列的矩阵运算来表示算法的过程。矩阵描述法简洁高效,但需要一定的数学基础。

算法的相关知识

1、算法是计算机科学中用来解决特定问题或执行特定任务的一组步骤。它是程序设计的核心,是计算机科学中最基本和重要的概念之一。

2、算法可以解决各种问题,例如排序、搜索、图的最短路径、最大值或最小值等。它们通常由一组指令组成,这些指令描述了如何解决特定问题或执行特定任务。算法可以是有序的或无序的,可以基于迭代或递归,也可以是确定性的或不确定性的。

3、算法的复杂度是评估算法效率的重要指标。它可以通过对算法的时间复杂度和空间复杂度进行分析来衡量。时间复杂度是算法执行所需的时间,空间复杂度是算法所需的空间。在设计和分析算法时,应尽可能选择具有较低复杂度的算法,以提高程序的效率和性能。

4、常用的算法包括排序算法、搜索算法、图算法、决策树算法等。其中,排序算法用于对一组数据进行排序,例如冒泡排序、选择排序、插入排序等。搜索算法用于在数据结构中查找特定元素,例如线性搜索、二分搜索等。

数据结构和算法在实际的软件开发中都有哪些

应用太多了。

基本上来说C#是基于面向对象语言,你所定义的所有类/结构体都算是数据结构,而且在类库中已经定义中诸多可用的类型以供使用。实际开发中根本就离不开结构与算法。

题主之所以有这样的问题,基本上认识到了很多程序员易犯的一个毛病——理论知识与实际应用中的脱节问题,不少程序员都说自己写程序用不上理论知识,或者是理论无用。我一直认为理论才是真正编程的指导,别说你所学的理论知识了,有时我们必须遵守一些软件活动上的标准/规范/规定。比如ISO标准有多少程序员读过或听说过?他实事就是关于openxml的一个国际标准,我们要想达到通用的程序,这些标准还是读一读的好。

扯回你的问题,什么是数据结构,什么是算法?如果你真的狭义理由数据结构,或者只是从课本上例子来说,数据结构被定义成一个只有属性成员的类或结构体才算是数据结构吗?事实上并不是,那么是不是只有链表/栈/队列才算是数据结构呢?可以说这是某些人狭义理解数据结构时的一种常规定势思维,但事实上来说,类或结构是数据结构的基本,否则你链表存在的实体到底是什么东西?所以数据结构包含着基本结构与狭义上的顺序表/链表/栈/队等存在实体的集体。为什么我说数据结构在实际运用中广泛体现呢?就数据结构而言,课本上只是为了讲明白结构而已,弱化了其中实体的真正含义,而且不语言的具体实现亦不尽相同,所以他们所讲的数据结构是基本理论的。

我来个例子:链表(C#语言)

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: 算法

“程序开发中罕用的十种算法-你用过几种 (程序开发中罕见的语言)” 的相关文章

从非负数据中揭示隐藏主题和特征-非负矩阵分解算法 (非负数值类型什么意思)

从非负数据中揭示隐藏主题和特征-非负矩阵分解算法 (非负数值类型什么意思)

原理 非负矩阵分解算法(NMF)是一种用于分析非负数据的算法。它将一个非负输入矩阵分解为两个非负矩阵的乘积。 应用场景 文本挖掘 图像处理 社交网络...

优化仿射变换模块算法以优化图像处置成果 (仿射变换模型)

优化仿射变换模块算法以优化图像处置成果 (仿射变换模型)

在计算机视觉畛域,图像处置是至关关键的一局部。但是,处置图像的环节中往往会遇到一些疑问,如图像变形、失真等。这些疑问关键是因为仿射变换模块的算法不够优化所造成的。那么,如何优化仿射变换模块的算法以...

如何选择和使用-业务模型与算法模型 (如何选择和使用注意事项)

如何选择和使用-业务模型与算法模型 (如何选择和使用注意事项)

数据模型:业务模型与算法模型的全面解析 导言 数据的世界离不开模型,但"模型"一词的使用往往令人困惑。从营销中的 4P 模型到机器学习中的 K-means 聚类,它们都被称为模型。那么,这些模型...

时序分析中的常用算法-都在这里了 (时序分析的特点)

时序分析中的常用算法-都在这里了 (时序分析的特点)

简介 时序分析是一种预测建模技术,它利用历史数据中事件的时间特征来预测未来事件的特征。它不同于回归分析,因为时序分析依赖于事件发生的顺序。 时序分析类型 时序分析分为两类: 静态时序分...

掌握算法并提升编程技能-程序员算法精通指南 (掌握算法的基本概念)

掌握算法并提升编程技能-程序员算法精通指南 (掌握算法的基本概念)

作为一名程序员,掌握算法对于解决复杂问题至关重要。在面试过程中,算法问题经常被问到,本文将介绍一些重要的算法,以及如何在面试中系统地准备算法。 深度优先搜索 深度优先搜索(DFS)是一...

马尔科夫随机场算法-建模图像和语音的强大方法 (马尔科夫随机场mrf)

马尔科夫随机场算法-建模图像和语音的强大方法 (马尔科夫随机场mrf)

马尔科夫随机场(Markov Random Field,简称 MRF)是一种用于建模图像和语音等数据的概率图模型。它基于马尔科夫性质,能够捕捉数据中的空间或时间相关性,从而提供了一种有效的方法来描...

Snowflake-一种翻新的散布式数据架构-探求-算法 (snowflakes)

Snowflake-一种翻新的散布式数据架构-探求-算法 (snowflakes)

雪花算法引见 雪花算法(Snowflake)是一种散布式惟一ID生成算法,用于生成全局惟一的ID。它的设计指标是在散布式系统中生成ID,保障ID的惟一性、有序性和趋向递增。雪花算法的外围现实...