【愚公系列】2021年11月 C#版 数据结构与算法解析(插入排序-希尔排序)

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 【愚公系列】2021年11月 C#版 数据结构与算法解析(插入排序-希尔排序)

1、希尔排序(Shell Sort)

1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。


1.1 算法描述

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:


选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;

按增量序列个数k,对序列进行k 趟排序;

每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1

时,整个序列作为一个表来处理,表长度即为整个序列的长度。

1.2 动图演示

image.png

1.3 代码实现

/// <summary>

/// 希尔排序

/// </summary>

public class Program {

   public static void Main(string[] args) {

       int[] array = { 43, 69, 11, 72, 28, 21, 56, 80, 48, 94, 32, 8 };

       int[] gaps = { 5, 3, 1 };

       for (int i = 0; i < gaps.Length; i++) {

           ShellsSort(array, gaps[i]);

       }

       ShowSord(array);

       Console.ReadKey();

   }

   private static void ShowSord(int[] array) {

       foreach (var num in array) {

           Console.Write($"{num} ");

       }

       Console.WriteLine();

   }

   public static void ShellsSort(int[] array, int gap) {

       int length = array.Length;

       for (int i = 0; i < gap; i++) {

           for (int j = i + gap; j < length; j += gap) {

               if (j < length) {

                   if (array[j] < array[j - gap]) {

                       int sentinel = array[j];

                       int k = 0;

                       for (k = j - gap; k >= i && sentinel < array[k]; k -= gap) {

                           array[k + gap] = array[k];

                       }

                       array[k + gap] = sentinel;

                   }

               }

           }

       }

   }

}

1.4 算法分析

希尔排序的核心在于间隔序列的设定。既可以提前设定好间隔序列,也可以动态的定义间隔序列。动态定义间隔序列的算法是《算法(第4版)》的合著者Robert Sedgewick提出的。

相关文章
|
16天前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》图、查找、排序专题考点(含解析)
408考研——《数据结构》图,查找和排序专题考点选择题汇总(含解析)。
69 29
|
16天前
|
存储 机器学习/深度学习 人工智能
C 408—《数据结构》易错考点200题(含解析)
408考研——《数据结构》精选易错考点200题(含解析)。
92 27
|
1月前
|
缓存 算法 安全
剖析‘共享文件夹只让指定用户看到’的 C# 精妙算法
在数字化时代,信息精准共享与管控至关重要。基于角色的访问控制(RBAC)算法通过将用户划分为不同角色并分配权限,确保“共享文件夹只让指定用户看到”。本文以C#代码为例,展示如何实现这一目标,并探讨大规模应用中的动态变更、性能优化和安全性挑战。RBAC算法结合C#编程,助力高效、安全的协作环境。
|
2月前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
3月前
|
算法 C#
C#常见的四种经典查找算法
C#常见的四种经典查找算法
|
3月前
|
算法 C# 索引
C#线性查找算法
C#线性查找算法!
|
3月前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
61 2
|
3月前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
78 7
C# 9.0 新特性解析
|
3月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
3月前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。

推荐镜像

更多