希尔排序详解

news/2025/2/13 0:13:20/

一.思路

希尔排序是建立在插入排序的思想之上的,因为插入排序在应对数组接近有序的情况下,时间复杂度接近O(N),故如果对数组先进行预排序,使数组接近有序,再进行直接插入排序,能大幅度降低时间复杂度

二.实现

首先完成单组实现:

int end = 0;
int x = a[end + gap];
while (end >= 0)
{if (a[end] > x){a[end + gap] = a[end];end = end - gap;}else{break;}
}

其次实现多组排序:

for (int i = 0; i < n - gap; i++)
{int end = i;int x = a[end + gap];while (end >= 0){if (a[end] > x){a[end + gap] = a[end];end = end - gap;}else{break;}}a[end + gap] = x;
}

最后实现插入排序:

while (gap > 1)
{gap = gap / 3 + 1;//gap越大,预排序次数越小,当gap=1时,进行插入排序for (int i = 0; i < n - gap; i++){int end = i;int x = a[end + gap];while (end >= 0){if (a[end] > x){a[end + gap] = a[end];end = end - gap;}else{break;}}a[end + gap] = x;}
}

三.结果输出

输入: 5, 8, 1, 6, 2, 6, 7, 3, 9, 4, 10  

输出:

四.时间复杂度

最好的情况:当该数组是有序的时候,时间复杂度为O(N)

最坏的情况:(1 + 2 + 3 +...N/gap)*gap

平均情况:N^1.3


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

相关文章

排序算法——希尔排序

希尔排序 什么是希尔排序为什么不直接使用插入排序希尔排序代码实现 什么是希尔排序 希尔排序也叫做&#xff1a;缩小增量排序。 分组&#xff08;分组的组数需要循环递减&#xff0c;直到减为1&#xff09;排序。 先将待排序序列分成若干组&#xff0c;然后使用直接插入排序在…

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

开始我们机器学习的第一个算法。 还是借用吴老师的例子&#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组…