希尔排序属于插入排序的一种,也称为缩小增量排序
基本思想:
将待排序数列划分为几个数列,对这几个数列分别进行直接插入排序
具体操作:
选取增量d(小于数列长度n),将数列划分为n/d个数列,对划分的数列进行直接插入排序
再选取一个增量d1,d1<d,重复上述步骤
直到dn = 1结束
取d=5
23 52 12 63 8 17 28 72 36 41
----------------------------------------------
23 17
|_______________________|
52 28
|_______________________|
12 72
|_______________________|
63 36
|_______________________|
8 41
|_______________________|
一趟排序结果:
17 28 12 36 8 23 52 72 63 41
----------------------------------------------
取d=2
17 12 8 52 63
|_________|________|_________|_________|
28 36 23 72 41
|________|_________|________|_________|
二趟排序结果:
8 23 12 28 17 36 52 41 63 72
---------------------------------------------
取d=1
三趟排序结果:
8 12 17 23 28 36 41 52 63 72
时间复杂度:
很难判断准确的时间复杂度,这和选择的增量d有关系
最坏情况和平均情况一样:O(n*log(n))
稳定性:
一次插入排序是稳定的,但是希尔排序是多次插入,在不同的插入排序过程中,相同元素在各自的插入排序中位置可能会变更,所以是不稳定排序
python代码示例:shell_sort.py
def shell_sort(l):
length = len(l)
d = length/2 #起始增量d选取为数列的一半
while(d >= 1):
for i in range(d, length): #对l[d...n-1]分别插入各组有序子序列中
j = i - d
while(j >= 0 and l[j] > l[j+d]): #距离增量d的两个元素比较
tmp = l[j]
l[j] = l[j+d]
l[j+d] = tmp
j -= d #以d为增量,继续循环比较该子序列内的元素
d = d/2 #下一增量选取
if __name__ == '__main__':
l = [93,102,36,82,76,84,55,63,49,27]
shell_sort(l)
print('result:' + str(l)
lua代码示例:shell_sort.lua
require "math"
function shell_sort(t)
length = table.getn(t)
d = math:floor(lenght/2)
while(d >= 1) do
for i = d+1, length do --对t[d...n-1]分别插入各组有序子序列中
j = i - d
while(j > 0 and t[j] > t[j+d]) do
tmp = t[j]
t[j] = t[j+d]
t[j+d] = tmp
j = j - d
end
end
d = math:floor(d/2)
end
end
t = {93,102,36,82,76,84,55,63,49,27}
shell_sort(t)
for _, v in ipairs(t) do
print v
end
分享到:
相关推荐
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
同时,插入排序也可以用于构建更复杂的排序算法,如希尔排序。 **源码和工具**: 标签中的"源码"指的是上述给出的`InsertionSort.java`文件,这个文件包含了插入排序的Java实现。"工具"可能是指开发环境中使用的...
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的元素按照一定的间隔分组,对每组进行插入排序,然后逐渐减小间隔,直至间隔为1,完成整个序列的...
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序...
各类排序算法整理--C语言描述--本人编写 排序算法种类有: 冒泡 快速排序 堆排序 希尔排序 插入排序 选择排序 二路归并排序
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
4. 希尔排序(Shell Sort):希尔排序是插入排序的一种优化版本,通过间隔序列(也称为增量序列)减少元素间的比较距离,从而提高效率。其平均时间复杂度介于O(n)到O(n^2)之间。 5. 快速排序(Quick Sort):快速...
本文将深入探讨标题和描述中提到的一些基本排序算法,包括选择排序、冒泡排序、插入排序、希尔排序、堆排序、快速排序以及归并排序,并结合C++编程语言进行讲解。 1. **选择排序(Selection Sort)** - 选择排序是一...
经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序Radix sort 经典排序算法 - 鸽巢排序Pigeonhole sort 经典排序算法 - 归并排序Merge sort 经典排序算法 - 冒泡排序Bubble sort 经典排序算法 - ...
在给定的标题和描述中,我们关注四种经典的排序算法:快速排序、希尔排序、插入排序和折半排序。这些算法各有特点,适用于不同的场景,下面将详细介绍它们的工作原理、性能以及应用场景。 1. **快速排序(Quick ...
本资源包含了多种经典的排序算法实现,包括选择排序、冒泡排序、希尔排序、插入排序和归并排序。下面将详细介绍这些排序算法及其原理。 1. **选择排序(Selection Sort)** - **基本思想**:每次遍历数组,找到...
本篇文章将深入探讨标题和描述中提到的九大排序算法:快速排序、冒泡排序、堆排序、希尔排序、直接插入排序、直接选择排序、基数排序、箱排序和桶排序。 1. **快速排序**:快速排序是一种基于分治策略的排序算法,...
此文件为数据结构中的九种排序算法,包含一些排序方法的过程,其九种排序包括:直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,基数排序!
8. 希尔排序:希尔排序是插入排序的一种优化版本,通过增量序列将待排序的元素分组,对每个组进行插入排序,然后逐步减小增量,直到增量为1,完成排序。希尔排序在实际应用中表现出较好的效果。 了解和掌握这些排序...
综上所述,希尔排序、直接插入排序和折半插入排序都是常见的排序算法。它们各有特点,适用于不同场景下的数据排序需求。希尔排序通过增加子序列的插入排序来提高效率;直接插入排序简单直观,但效率较低;而折半插入...
(1) 完成5种常用内部排序算法的演示,5种排序算法为:快速排序,直接插入排序,选择排序,堆排序,希尔排序; (2) 待排序元素为整数,排序序列存储在数据文件中,要求排序元素不少于30个; (3) 演示程序开始,...
七大排序算法如下: 交换排序:快速排序quicksort,冒泡排序bubblesort 选择排序:直接选择排序selectionsort,堆排序maxheapsort...插入排序:直接插入排序insertsort,希尔排序shellsort 合并排序:归并排序mergesort
在众多排序算法中,希尔排序、冒泡排序、插入排序和选择排序因其简洁性和易于理解性,成为了经典的入门级算法。本文将对这些算法进行详细的探讨,旨在分析它们的原理、特点及适用场景。 首先,让我们来看看希尔排序...