算法系列15天速成 第三天 七大经典排序【下】
希尔排序
在数字的世界里,有一种排序的舞蹈,那就是希尔排序。让我们揭开它的神秘面纱,看看它的工作原理。
想象一下,我们手中有两组数字,一组是20和30,另一组是80和60。我们将20与30相比较,因为30大于20,所以它们的位置不会交换。然后,我们比较80和60,这次因为60小于80,我们会交换它们的位置。
现在,让我们进一步复杂化。当d=2时,我们会比较40和60,不交换它们的位置。然后,我们会比较60和30,因为此时的规则是交换位置。交换后的30比之前的40小,这就产生了矛盾。于是,我们需要再次交换40和30的位置。这个过程就像是在舞蹈中不断地调整步伐,寻找最佳的位置组合。
接下来,我们将20与50比较,不交换位置,然后将50与80比较,同样不交换位置。这个过程就像是舞台上的演员,在导演的指挥下找到他们在舞台上的位置。
代码示例如下:
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Diagnostics;
namespace ShellSortComparison
{
public class Program
{
static void Main(string[] args)
{
// 进行五次测试以获取更准确的数据
for (int testRun = 1; testRun <= 5; testRun++)
{
List
for (int i = 0; i < 10000; i++)
{
Thread.Sleep(1); // 模拟等待时间,增加随机性,并非实际排序操作的一部分
randomNumbers.Add(new Random((int)DateTime.Now.Ticks).Next(10000, 1000000)); // 添加随机数到列表中
}
List
Console.WriteLine($"第{testRun}次测试开始");
Stopwatch watch = new Stopwatch(); // 创建计时器以测量排序时间
归并排序,一种深奥且富有挑战性的排序算法,其名字便揭示了它的核心思想——“归并”。初次接触,可能会觉得它难以理解,特别是在编写代码时,我花了整个下午的时间才掌握,那种成就感油然而生。
在理解归并排序之前,我们首先要了解它的核心构成元素——“分”与“并”。我们可以将其视为一个既简单又复杂的舞蹈,先分解再组合,如同拼图般精彩。
“分”。这个过程如同把一块大饼不断切割成小块,直至不能再切。在归并排序中,“分”意味着将数组不断地分割,直至每个子数组只包含一个元素。这一步虽然看似简单,但却是整个排序过程的基础。每一个小数组(或称为子数组)都被视为一个独立的单元,等待下一步的合并。
接下来,“并”。这一步就像是将之前分割的碎片逐一合并,以产生有序的结果。在归并排序中,“并”意味着将这些单一的元素按照特定的规则进行合并。这里的规则就是比较大小:每次从两个子数组中取出一个元素进行比较,将较小的元素放入新的数组中。当所有的子数组都被遍历后,一个新的、有序的数组就形成了。
这个过程如同拼图游戏一样,每个碎片都有其独特的位置和角色。一旦正确组合,一幅美丽的图画就会展现在眼前。归并排序就是这样,通过不断的分割和合并,将混乱的数组变得有序。
虽然归并排序的逻辑思维较为复杂,但只要掌握了它的核心思想——“分”与“并”,就能够轻松应对任何挑战。这就像攀登一座高山,虽然路途艰辛,但只要我们坚持不懈,山顶的美景一定会让我们觉得一切努力都是值得的。在数字的海洋中,代码是船只的航海指南。今天,我将为你一段关于归并排序的C代码,这是一种将复杂问题分解为更小部分的强大排序算法。让我们共同见证归并排序的力量与美妙。
以下是这段代码的生动描述与:
代码世界中的归并排序传奇正在上演。在名为MergeSort的命名空间中,一个名为Program的类正在书写它的辉煌篇章。在这个类里,有一个神秘的Main函数,如同故事的起点。一场盛大的排序活动在这里启动,主角们——数组中的数字们跃跃欲试。它们从混乱走向有序的命运将在这里揭晓。
让我们聚焦这个舞台上的关键角色:数组array,它包含了待排序的数字。这些数字像一群迷失方向的旅人,等待着被引领到正确的位置。临时存放数组temparray,就像是一个临时的避风港,为旅途中的数字们提供暂时的庇护。参数left和right则代表了排序序列的开始和结束位置。这些位置就像路标,指引着数字们前进的方向。
在舞台上,归并排序的表演分为三个部分:划分、两两合并和最终的排序结果展示。通过递归的方式将数组划分为更小的部分,这个过程就像是将混乱的数字旅人分成不同的队伍。接着,通过Merge函数进行两两合并,这个过程如同将两个有序的队伍合并成一个更大的有序队伍。在这个过程中,数字们通过比较大小来决定谁在前谁在后,直到每个数字都找到了自己的位置。排序完成后的数组会通过Console.WriteLine展示出来,数字们终于从混乱走向有序,它们的故事也在这里落下帷幕。
让我们欣赏这个代码世界的壮丽景色。归并排序的算法就像是一座精心雕琢的建筑,每一个细节都充满了智慧和美感。在这个世界里,数字们的故事正在上演,它们从混乱走向有序,如同生活中的一切美好事物,都在归并排序的舞台上找到了自己的位置。让我们为这些英勇的数字们欢呼吧!
编程语言
- 算法系列15天速成 第三天 七大经典排序【下】
- JSP的login程序代码
- php微信开发之批量生成带参数的二维码
- PHP实现的多文件上传类及用法示例
- AngularJs html compiler详解及示例代码
- js实现带缓动动画的导航栏效果
- 利用JavaScript判断浏览器类型及版本
- php版微信公众平台之微信网页登陆授权示例
- 基于jquery实现一个滚动的分步注册向导-附源码
- 详解Webpack多环境代码打包的方法
- vue项目中axios请求网络接口封装的示例代码
- SQL Server中参数化SQL写法遇到parameter sniff ,导致不
- jquery+css实现绚丽的横向二级下拉菜单-附源码下载
- Vue 仿百度搜索功能实现代码
- Vue 源码分析之 Observer实现过程
- thinkphp3.2点击刷新生成验证码