C#算法大全(中)

简介: 今天有人想让我搞一期C#算法大全。算法就算法,安排上!

排序算法

计算机处理数据包括排序、检索(查找)、修改和删除操作。我们研究排序算法有几点充分理由。首先,是因为它实际应用非常频繁,计算机厂家…… 这个你要听吗? 不废话了。为了说明方便.定义如下数组: a:array[1…10] of integer;temp: 中间变量首先从要排序的数中选择最大的数,将它放在第一个位置,然后从剩下的数中选择最大的数放在第二个位置,如此继续,直到最后从剩下的两个数中选择最大的数放在倒数第二个位置,剩下的一个数放在最后位置,完成排序。下表是六个元素的排序的过程。

4 5 7 1 2 3

┗━━┛

5 4 7 1 2 3

┗━━━━┛

7 4 5 1 2 3

┗━━━━━━┛

7 4 5 1 2 3

┗━━━━━━━━━━┛ 第一趟结束

⑦ 4 5 1 2 3

┗━┛

7 5 4 1 2 3

┗━━━┛

7 5 4 1 2 3

┗━━━━━┛

7 5 4 1 2 3

┗━━━━━━━┛ 第二趟结束

7 ⑤ 4 1 2 3

┗━┛

7 5 4 1 2 3

┗━━━┛

7 5 4 1 2 3

┗━━━━━┛ 第三趟结束

7 5 ④ 1 2 3

┗━┛

7 5 4 2 1 3 第四趟结束

┗━━━┛

7 5 4 ③ 1 2

┗━┛ 第五趟结束

7 5 4 3 ② ①

算法实现

for i:=1 to 9 do
for j:=i+1 to 10 do
if a[i]<a[j]
begin
temp:=a[i];
a[i]:=a[j];
a[j]:=temp;
end;

改进

以上排序方案每次交换两个元素需要执行三个语句,过多的交换必定要花费许多时间.改进方案是在内循环的比较中找出最大值元素的下标,在内循环结束时才考虑是否要调换.

代码如下

for i:=1 to 9 do
begin
k:=i;
for j:=i+1 to 20 do
if a[j]>a[k]
then k:=j;
if i<k {不可能大于}
then begin
temp:=a[i];
a[i]:=a[k];
a[k]:=temp;
end;
end;

冒泡排序

依次比较相邻的两个数,把大的放前面,小的放后面.即首先比较第1个数和第2个数,大数放前,小数放后.然后比较第2个数和第3个数…直到比较最后两个数.第一趟结束,最小的

一定沉到最后.重复上过程,仍从第1个数开始,到最后第2个数.然后…

由于在排序过程中总是大数往前,小数往后,相当气泡上升,所以叫冒泡排序.

下面是6个元素的排序的过程

4 5 7 1 2 3

┗━━┛

5 4 7 1 2 3

┗━━┛

5 7 4 1 2 3

┗━━┛

5 7 4 1 2 3

┗━━┛

5 7 4 2 1 3

┗━━┛ 第一趟结束

5 7 4 2 3 ①

┗━━┛

7 5 4 2 3 1

┗━━┛

7 5 4 2 3 1

┗━━┛

7 5 4 2 3 1

┗━━┛ 第二趟结束

7 5 4 3 ② 1

┗━━┛

7 5 4 3 2 1

┗━━┛

7 5 4 3 2 1

┗━━┛ 第三趟结束

7 5 4 ③ 2 1

┗━━┛

7 5 4 3 2 1

┗━━┛ 第四趟结束

7 5 ④ 3 2 1

┗━━┛ 第五趟结束

⑦ ⑤ 4 3 2 1

算法实现

for i:=1 to 9 do
for j:=1 to 10-i do
if a[j]<a[j+1]
then begin
temp:=a[j];
a[j]:=a[j+1];
a[j+1]:=temp;
end;

改进

上例中,可以发现,第二趟结束已经排好序.但是计算机此时并不知道已经排好序.所以,还需进行一次比较,如果没有发生任何数据交换,则知道已经排好序,可以不干了.因此第

三趟比较还需进行,第四趟、第五趟比较则不必要.

我们设置一个布尔变量bo 来记录是否有进行交换.值为false 进行了比较 true 则没有

代码如下

i:=1;
repeat
bo:=true;
for j:=1 to 10-i
if a[j]<a[j+1] then
begin
temp:=a[j];
a[j]:=a[j+1];
a[j+1]:=temp;
bo:=false;
end;
      inc(i);
until bo;

再次改进

如果说是有20个元素,数据序列是8,3,4,9,7再后跟着15个大于9且已经排好序的数据,在第三趟后算法终止。总共做了19+18+17=54次比较使得绝大多数已排好序的数据在一遍。

我们改进如下

flag:=10;
while flag>0 do
begin
k:=flag-1;
flag:=0;
for i:=1 to k do
if a[i]<a[i+1] then
begin
temp:=a[i];
a[i]:=a[i+1];
a[i+1]:=temp;
flag:=i;
end;
end; 

改进的冒泡算法对上述数据进行的比较次数是19+4+2=24.

希尔排序

希尔排序法是1959年由D.L.Shell提出来的,又称减少增量的排序。下表是以八个元素排序示范的例子.在该例中,开始时相隔4个成分,分别按组进行排序,这时每组2个成分,共4组;

然后相隔2个成分,在按组排序…最后,对所有相邻成分进行排序.

可参阅<<计算机程序设计技巧??第三卷排序查找

算法实现

j:=10;
i:=1;
while j>1 do
begin
j:=j div 2;
repeat
alldone:=true;
for index:=1 to 10-j do
begin
i:=index+j;
if a[index]<a[i] then
begin
temp:=a[index];
a[index]:=a[i];
a[i]:=temp;
alldone:=false;
end;
end;
until alldone
end;

插入排序

基本思想

对不起,我没书.所以是我自己讲.我很菜.不要介意插入排序的思想就是读一个,排一个.  //也许是这样,起码我是这么认为的:)将第1个数放入数组的第1个元素中,以后读入的数与已存入数组的数进行比较,确定它在从大到小的排列中应处的位置.将该位置以及以后的元素向后推移一个位置,将读入的新数填入空出的位置中.

算法实现

procedure insert(x,num:integer);
var
i,pos:integer;
search:boolean;
begin
pos:=1;
search:=true;
while search and (pos<=num ) do
if x>a[pos]
then search:=fasle
else inc(pos);
for i:=num downto pos do
a[i+1]:=a[i];
a[pos]:=x;
num:=num+1;
end;
num:=0 {当前数组的长度}
for i:=1 to 10 do
begin
read(x);
intert(x,num)        
end;

合并排序

基本思想

合并排序的算法就是二分法。

分解:将n个元素分解成各含 一半元素的子序列。

解决:用合并排序法对两个子序列递归地排序。

合并:合并两个已排序的子序列排序结果。

在对子序列排列时,当其长度为1时递归结束,因为单个元素被认为是已排好序的.合并排序的.合并排序的关键步骤在于合并目前产生的两个已排好序的子序列:

A[p…q] 和 A[q+1…r];

将它们合并成一个已排好序的子序列A[p…r]. 我们引入一个辅助过程merge(A,p,q,r)来完成这一项合并工作,其中A是数组,p,q,r是下标.

算法实现

procedure merge( p,q,r:integer);
var
i,j,t:integer;
it:array[1..10] of integer;
begin
t:=p; i:=p; j:=q+1;
while t<=r do
begin
if (i<=q) and ((j>j) or (a[i]<=a[j]))
then begin
it[t]:=a[i]; inc(i);
end
else begin
it[t]:=a[j]; inc(j);
end;
inc(t);
end;
for i:=p to r do a[i]:=t[i];
end;
procedure merge_sort(p,r:integer);
var q:integer;
begin
if p<>r then begin
q:=(p+r-1) div 2 ;
merge_sort(p,q);
merge_sort(q+1,r);
merge(p,q,r);
end;
end;
begin
merge_sort(1,10);
end.

快速排序

基本思想

快速排序的基本思想是基于分治策略的。对于输入的子序列L[p…r],如果规模足够小则直接进行排序,否则分三步处理:

分解(Divide):将输入的序列L[p…r]划分成两个非空子序列L[p…q]和L[q+1…r],使L[p…q]中任一元素的值不大于L[q+1…r]中任一元素的值。

递归求解(Conquer):通过递归调用快速排序算法分别对L[p…q]和L[q+1…r]进行排序。

合并(Merge):由于对分解出的两个子序列的排序是就地进行的,所以在L[p…q]和L[q+1…r]都排好序后不需要执行任何计算L[p…r]就已排好序。

这个解决流程是符合分治法的基本步骤的。因此,快速排序法是分治法的经典应用实例之一。

排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法 对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用

O方法来表示。在后面我将 给出详细的说明。

对 于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。 我将按照算法的复杂度,从简单到难来分析算法。第一部分是简单排序算法,后面你将看到他们的共同

点是算法复杂度为O(N*N)(因为没有使用word,所 以无法打出上标和下标)。第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种算法因为

涉及树与堆的概念,所以 这里不于讨论。 第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可

以让我们从另外的角度来认识 这个问题。现在,让我们开始吧:

简单排序算法

由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境

下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么

问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。

相关文章
|
1月前
|
存储 监控 算法
电脑监控管理中的 C# 哈希表进程资源索引算法
哈希表凭借O(1)查询效率、动态增删性能及低内存开销,适配电脑监控系统对进程资源数据的实时索引需求。通过定制哈希函数与链地址法冲突解决,实现高效进程状态追踪与异常预警。
161 10
|
5月前
|
存储 运维 监控
基于 C# 语言的 Dijkstra 算法在局域网内监控软件件中的优化与实现研究
本文针对局域网监控系统中传统Dijkstra算法的性能瓶颈,提出了一种基于优先队列和邻接表优化的改进方案。通过重构数据结构与计算流程,将时间复杂度从O(V²)降至O((V+E)logV),显著提升大规模网络环境下的计算效率与资源利用率。实验表明,优化后算法在包含1000节点、5000链路的网络中,计算时间缩短37.2%,内存占用减少21.5%。该算法适用于网络拓扑发现、异常流量检测、故障定位及负载均衡优化等场景,为智能化局域网监控提供了有效支持。
144 5
|
1月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
184 4
|
6月前
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
194 8
|
6月前
|
存储 监控 算法
解析公司屏幕监控软件中 C# 字典算法的数据管理效能与优化策略
数字化办公的时代背景下,企业为维护信息安全并提升管理效能,公司屏幕监控软件的应用日益普及。此软件犹如企业网络的 “数字卫士”,持续记录员工电脑屏幕的操作动态。然而,伴随数据量的持续增长,如何高效管理这些监控数据成为关键议题。C# 中的字典(Dictionary)数据结构,以其独特的键值对存储模式和高效的操作性能,为公司屏幕监控软件的数据管理提供了有力支持。下文将深入探究其原理与应用。
164 4
|
7月前
|
机器学习/深度学习 监控 算法
员工上网行为监控软件中基于滑动窗口的C#流量统计算法解析​
在数字化办公环境中,员工上网行为监控软件需要高效处理海量网络请求数据,同时实时识别异常行为(如高频访问非工作网站)。传统的时间序列统计方法因计算复杂度过高,难以满足低延迟需求。本文将介绍一种基于滑动窗口的C#统计算法,通过动态时间窗口管理,实现高效的行为模式分析与流量计数。
200 2
|
7月前
|
人工智能 运维 算法
基于 C# 深度优先搜索算法的局域网集中管理软件技术剖析
现代化办公环境中,局域网集中管理软件是保障企业网络高效运行、实现资源合理分配以及强化信息安全管控的核心工具。此类软件需应对复杂的网络拓扑结构、海量的设备信息及多样化的用户操作,而数据结构与算法正是支撑其强大功能的基石。本文将深入剖析深度优先搜索(Depth-First Search,DFS)算法,并结合 C# 语言特性,详细阐述其在局域网集中管理软件中的应用与实现。
184 3
|
4月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
133 2
|
5月前
|
监控 算法 数据处理
内网实时监控中的 C# 算法探索:环形缓冲区在实时数据处理中的关键作用
本文探讨了环形缓冲区在内网实时监控中的应用,结合C#实现方案,分析其原理与优势。作为固定长度的循环队列,环形缓冲区通过FIFO机制高效处理高速数据流,具备O(1)时间复杂度的读写操作,降低延迟与内存开销。文章从设计逻辑、代码示例到实际适配效果展开讨论,并展望其与AI结合的潜力,为开发者提供参考。
258 2
|
5月前
|
监控 算法 安全
公司电脑监控软件关键技术探析:C# 环形缓冲区算法的理论与实践
环形缓冲区(Ring Buffer)是企业信息安全管理中电脑监控系统设计的核心数据结构,适用于高并发、高速率与短时有效的多源异构数据处理场景。其通过固定大小的连续内存空间实现闭环存储,具备内存优化、操作高效、数据时效管理和并发支持等优势。文章以C#语言为例,展示了线程安全的环形缓冲区实现,并结合URL访问记录监控应用场景,分析了其在流量削峰、关键数据保护和高性能处理中的适配性。该结构在日志捕获和事件缓冲中表现出色,对提升监控系统效能具有重要价值。
164 1