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

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

admin8个月前 (04-20)数码39

当编写程序时,了解和经常使用不同的算法对处置疑问至关关键。以下是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)是一种用于分析非负数据的算法。它将一个非负输入矩阵分解为两个非负矩阵的乘积。 应用场景 文本挖掘 图像处理 社交网络...

编程利器-面试法宝-刷题360-悟透算法真理 (面条式编程)

编程利器-面试法宝-刷题360-悟透算法真理 (面条式编程)

最近不时在刷算法题,刷华为OD算法题,有诸多好处: 宿愿用我自己疯狂刷题的劲头,感化大家,让大家爱上刷题,顺利经过华为OD机试,把握更多低劣的算法。 上方这道题,是很经典的深度优先搜查...

探索个性化推荐的新维度-面向推荐系统的深度强化学习算法研究与应用

探索个性化推荐的新维度-面向推荐系统的深度强化学习算法研究与应用

引言 随着互联网的快速发展,推荐系统在各个领域中扮演着重要的角色。传统的推荐算法在面对大规模、复杂的数据时存在一定的局限性。为了解决这一问题,深度强化学习算法应运而生。本文将探讨面向推荐系统的深...

Dijkstra算法的深入探索-把握效率与最优性 (dijkstra 怎么读)

Dijkstra算法的深入探索-把握效率与最优性 (dijkstra 怎么读)

引言 在计算机科学和图论中,算法在有效解决复杂问题方面起着至关重要的作用。其中一个突出的算法是Dijkstra算法,它由荷兰计算机科学家Edsger W. Dijkstra于1956年开发。...

面向跨领域数据的迁移学习算法与模型研究 (什么是跨领域)

面向跨领域数据的迁移学习算法与模型研究 (什么是跨领域)

引言 随着数据的快速增长和跨领域应用的需求,如何利用已有的知识和数据来解决新领域的问题成为了一个重要的研究方向。迁移学习作为一种有效的机器学习方法,可以通过利用源领域的知识和数据来改善目标领...

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

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

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

强化学习算法在资源调度与优化领域的革命性应用 (深度学习算法)

强化学习算法在资源调度与优化领域的革命性应用 (深度学习算法)

强化学习简介 强化学习是一种机器学习方法,通过智能体与环境的交互来学习最优策略。在资源调度与优化中,我们可以将资源调度问题看作是一个强化学习问题,其中智能体是资源调度器,环境是计...