C#数据结构与算法系列(二十一):希尔排序算法(ShellSort)
1.介绍
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。
2.基本思想
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止
3.示意图
4.代码
using System; namespace DataStructure { public class ShellSort { /// <summary> /// 测试希尔排序 /// </summary> public static void Test() { int[] arr = { 8, 9, 1, 7, 2, 3, 5, 4, 6, 0 }; Console.WriteLine("需要排序的数组:" + ArrayToString(arr)); Console.WriteLine("\n封装后的测试"); //测试封装后的希尔排序 Sort(arr); Console.WriteLine("\n封装前的测试"); arr = new int[] { 8, 9, 1, 7, 2, 3, 5, 4, 6, 0 }; int temp = 0; //希尔排序第一轮 //因为第一轮排序,是将十个数据分成了五组 for (int i = 5; i < arr.Length; i++) { //遍历各组中所有元素(10/2=5)步长五 for (int j = i - 5; j >= 0; j -= 5) { if (arr[j] > arr[j + 5]) { temp = arr[j]; arr[j] = arr[j + 5]; arr[j + 5] = temp; } } } Console.WriteLine("\n第一轮希尔排序的结果:" + ArrayToString(arr)); //3,5,1,6,0,8,9,4,7,2 //希尔排序第二轮 //因为第二轮排序,是将十个数据分成了5/2=2组 for (int i = 2; i < arr.Length; i++) { for (int j = i - 2; j >= 0; j -= 2) { if (arr[j] > arr[j + 2]) { temp = arr[j]; arr[j] = arr[j + 2]; arr[j + 2] = temp; } } } Console.WriteLine("\n第二轮希尔排序的结果:" + ArrayToString(arr)); //希尔排序第三轮 //因为第三轮排序,是将十个数据分成了2/2=1组 for (int i = 1; i < arr.Length; i++) { for (int j = i - 1; j >= 0; j -= 1) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } Console.WriteLine("\n第三轮希尔排序的结果:" + ArrayToString(arr)); } /// <summary> /// 封装希尔排序 /// </summary> /// <param name="arr"></param> private static void Sort(int[] arr) { int temp = 0; int count = 0; //遍历各组中的所有元素(共gap组,每组有个元素),步长gap for (int gap = arr.Length / 2; gap > 0; gap /= 2) { for (int i = gap; i < arr.Length; i++) { for (int j = i - gap; j >= 0; j -= gap) { //如果当前元素大于加上步长后的那个元素,说明交换 if (arr[j] > arr[j + gap]) { temp = arr[j]; arr[j] = arr[j + gap]; arr[j + gap] = temp; } } } Console.WriteLine($"\n第{++count }轮希尔排序的结果:{ArrayToString(arr)}"); } } private static string ArrayToString(int[] arr) { return string.Join(",", arr); } } }
5.演示结果
微信:17873041739
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?