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

简介: 【愚公系列】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提出的。

相关文章
|
12天前
|
存储 机器学习/深度学习 算法
|
14天前
|
机器学习/深度学习 数据采集 人工智能
【热门话题】AI作画算法原理解析
本文解析了AI作画算法的原理,介绍了基于机器学习和深度学习的CNNs及GANs在艺术创作中的应用。从数据预处理到模型训练、优化,再到风格迁移、图像合成等实际应用,阐述了AI如何生成艺术作品。同时,文章指出未来发展中面临的版权、伦理等问题,强调理解这些算法对于探索艺术新境地的重要性。
29 3
|
15天前
|
存储 算法 安全
|
16天前
|
存储 NoSQL Redis
Redis入门到通关之数据结构解析-IntSet
Redis入门到通关之数据结构解析-IntSet
22 1
|
16天前
|
存储 NoSQL Redis
Redis入门到通关之数据结构解析-SkipList
Redis入门到通关之数据结构解析-SkipList
30 0
|
16天前
|
存储 NoSQL Redis
Redis入门到通关之数据结构解析-QuickList
Redis入门到通关之数据结构解析-QuickList
25 0
|
16天前
|
存储 NoSQL 安全
Redis入门到通关之数据结构解析-动态字符串SDS
Redis入门到通关之数据结构解析-动态字符串SDS
18 0
|
16天前
|
存储 NoSQL Java
Redis入门到通关之数据结构解析-Dict
Redis入门到通关之数据结构解析-Dict
19 2
|
16天前
|
存储 NoSQL Redis
Redis入门到通关之数据结构解析-ZipList
Redis入门到通关之数据结构解析-ZipList
21 0
|
16天前
|
存储 NoSQL Redis
Redis入门到通关之数据结构解析-RedisObject
Redis入门到通关之数据结构解析-RedisObject
25 1

推荐镜像

更多