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

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

admin7个月前 (04-20)数码35

当编写程序时,了解和经常使用不同的算法对处置疑问至关关键。以下是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年开发。...

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

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

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

使用生成对抗网络实现图像风格转换的突破性新算法 (使用生成对抗性网络的舞蹈动作生成)

使用生成对抗网络实现图像风格转换的突破性新算法 (使用生成对抗性网络的舞蹈动作生成)

一、图像风格转换简介 图像风格转换是指将一张图像的风格转换为另一张图像的风格,而保持图像内容不变。传统的图像风格转换方法通常基于图像的像素级别操作,如调整亮度、对比度和色彩等。这些方法往往无...

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

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

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