C#排序算法之希尔排序

news/2025/2/12 18:35:30/

前言

希尔排序是插入排序的优化,它利用了分治的思想,将需要排序的数组分为几段,在每一段中做插入排序。通过分治的思想,使得排序效率比起原来的插入排序要快了很多。对于插入排序,不了解的可以查看我之前的文章(C#排序算法之插入,选择和冒泡排序)。

算法思路

希尔排序分段的思路一般是有一个步长,数组内的元素按照步长划分为几部分,在这几部分中做插入排序,然后再缩短步长,最后步长为一时就是对全数组的插入排序,因为前面的分段插入排序过程中,数组从无序逐步变成有序,所以最后一次插入排序只需要移动极少部分元素,这比起直接对整个数组做插入排序要快了很多。步长和每次步长的变化都是可以自己定义,不过一般都是将初始步长设置为数组元素一般,然后每次步长缩小一半,这种设置方式常见而且效率很高。

例如:有一组数据5,1,1,3,2,10,8。假设初始步长为数据长度一半,即3。每次步长缩小一半。

首次步长为3,可以将数组分为以下三部分

5,3,8

1,2

1,10

对其进行插入排序得到结果

3,1,1,5,2,10,8

步长缩小,此时步长为1,可将数组分为1部分,并对齐进行插入排序,得到结果为

1,1,2,3,5,8,10

例子中的数据量比较少,不能很好的体现出和插入的区别,但是数据量一旦大起来,每一次分段进行插入排序需要移动的数据都会大大减少,效率也会高非常多。

实现代码

Sort父类中仅仅包含一个数据元素交换方法Swap。

public class ShellSort : Sort{public static void Sort(int[] array){int step = array.Length / 2;while (step > 0){for (int i = step; i < array.Length; i++){int index = i;for (int j = i - step; j >= 0; j-=step){if (array[i] >= array[j])break;index = j;}int val = array[i];for (int j = i; j > index; j -= step)array[j] = array[j - step];array[index] = val;}step /= 2;}}}

 时空复杂度

时间复杂度:对于步长为原数组一半,每次缩小一半的情况的时间复杂度估计为O(n^(4/3)),这个算法的时间复杂度没有推出来,只有预测复杂度。

空间复杂度:O(1)


http://www.ppmy.cn/news/824853.html

相关文章

关于vue2项目搭建的步骤

vue2项目每次搭建项目总是需要注意各种插件的版本&#xff0c;在这里记录一下&#xff0c;免得总是需要看半天需要安装哪个版本。 1.创建项目 vue create 项目名称 2.安装路由插件及配置 npm i vue-router3 &#xff08;1&#xff09;router/index.jsimport VueRouter fro…

插入排序与希尔排序

插入排序 将一元素插入到已排序完毕的数组中 可以将无序数组的第一个元素看作 只有一个元素的有序数组 后将数组中的元素一一插入到有序数组中的合适位置 所有元素被插入到有序数组中时&#xff0c;便已将此数组置为有序 动图演示 代码逻辑如下&#xff1a; 以升序为例 …

希尔排序(升序)

希尔排序就是按照不同间隔&#xff0c;对序列进行排序&#xff0c;直到间隔步长为1时&#xff0c;排序后&#xff0c;该序列即为升序序列。 一般步长选取序列长度除以2的k次幂&#xff0c;在不同步长下&#xff0c;将序列各组进行插入排序。大大的减少了插入排序的时间复杂度。…

八大排序算法之4希尔排序算法

希尔排序算法从简单到困难的推导过程 算法思路 1利用交换法实现希尔排序希尔排序使用交换法的粗暴的代码实现用交换排序法的希尔排序算法 2利用插入排序法的希尔排序算法首先要了解什么叫做插入排序算法回忆插入算法 用最粗暴原始的方式利用插入排序来实现希尔排序第一步分成4组…

学习笔记-希尔排序

希尔排序 将一个一维数组从小到大排序。希尔排序是插入排序的优化方式&#xff0c;因为普通的插入排序会存在一个问题&#xff0c;那就是当比较小的数字排在后面时&#xff0c;需要后移很多次才能完成。 思路 由此&#xff0c;希尔排序的思路是&#xff1a;引入一个步长的因…

基础篇--单片机简介

单片机简介 视频教程 单片机是什么 单片机&#xff1a;Single-Chip Microcomputer 单片微型计算机&#xff0c;是一种集成电路芯片 单片机有什么用&#xff1f; 单片机发展历程 单片机发展超势 CISC Vs RISC CISC和RISC举例 https://wenku.baidu.com/view/b074b0ed998fcc22b…

简单快捷的在线 AAB 转换 APK 服务

初雪云-iPA上传发布工具,证书制作工具,ApplicationLoader,上架App Store,安卓市场上架,软著申请服务&#xff0c;windows,linux,mac发布上传提交苹果 在移动应用开发中&#xff0c;AAB&#xff08;Android App Bundle&#xff09;已经成为了一种广泛使用的发布格式。然而&#…

技术是如何创造价值的

一、技术是怎样创造价值的 技术是不能直接创造价值的&#xff0c;它需要媒介。 我们从三个角度来看&#xff1a; 通过创新来创造价值 通过干中学来创造价值 通过解决问题来创造价值 1 通过创新来创造价值 创新&#xff08;innovation&#xff09;这个词源于古董级的人物熊彼特。…