排序算法——希尔排序

news/2025/2/12 23:47:18/

希尔排序

  • 什么是希尔排序
  • 为什么不直接使用插入排序
  • 希尔排序代码实现

什么是希尔排序

希尔排序也叫做:缩小增量排序。 分组(分组的组数需要循环递减,直到减为1)排序。
先将待排序序列分成若干组,然后使用直接插入排序在组内排序。循环着将分组数减小,执行以上过程。直到分组减为1. 所有的分组数都互质。

分组可为任意数字,且每次分组数都比上一次分组要小,直至分组数为1。
在这里插入图片描述

为什么不直接使用插入排序

相比较插入排序,希尔排序输入直接插入排序的一种,但是在两种算法的比较上

希尔排序: 就是直接插入排序的优化, 数据越有序,排序越快
时间复杂度: 时间复杂度是与增量序列相关的函数 O(n^1.3~1.5)
空间复杂度: O(1)
稳定性: 不稳定
直接插入排序
时间复杂度: 等差数列 O(n^2)
数据序列已经有序,则能达到最好时间复杂度: O(n)
数据趋于有序(部分有序): 时间复杂度就可以趋于 O(n),–> 数据越有序,时间复杂度越低。
空间复杂度: O(1)
稳定性: 稳定的

在这里插入图片描述
对于一个长度为10000的需要排序的数组,希尔排序只需要更少的比较次数与交换次数。

希尔排序代码实现

void Shell(int *arr, int len, int width)
{for(int i = width; i < len; ++i){int tmp = arr[i];int j = i - width;for(; j >= 0 && arr[j] > tmp; j -= width){arr[j+width] = arr[j];}arr[j+width] = tmp;}
}void ShellSort(int *arr, int len)
{int group[] = {5, 3, 1};for(int i = 0; i < sizeof(group)/sizeof(group[0]); ++i){Shell(arr, len, group[i]);}
}

很显然,希尔排序不过对直接插入排序前进行了一次分组。分组使得希尔排序对于大量的数据处理更有优势,但是也增加了不稳定性。


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

相关文章

入坑机器学习:四,单变量线性回归

开始我们机器学习的第一个算法。 还是借用吴老师的例子&#xff1a; 这个例子是预测住房价格的&#xff0c;我们要使用一个数据集&#xff0c;数据集包含俄勒冈州波特兰市的住房价格。在这里&#xff0c;我要根据不同房屋尺寸所售出的价格&#xff0c;画出我的数据集。比方说&…

C语言数据结构希尔排序(示例代码)

#include <stdio.h> #include <stdbool.h> #define MAX 7 int intArray[MAX] {4,6,3,2,1,9,7}; void printline(int count) { int i; for(i 0;i < count-1;i) { printf(“”); } printf(“\n”); } void display() { int i; printf(“[”); // navigat…

C#排序算法之希尔排序

前言 希尔排序是插入排序的优化&#xff0c;它利用了分治的思想&#xff0c;将需要排序的数组分为几段&#xff0c;在每一段中做插入排序。通过分治的思想&#xff0c;使得排序效率比起原来的插入排序要快了很多。对于插入排序&#xff0c;不了解的可以查看我之前的文章&#…

关于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;引入一个步长的因…