希尔排序(Shell Sort)
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
步骤:
1.先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插
2.入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量
=1(
<
…<d2<d1),即所有记录放在同一组中进行
3.直接插入排序为止。
实质
比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比[2] 较就可能消除多个元素交换。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。一般的初次取序列的一半为增量,以后每次减半,直到增量为1。
实例分析
以4为关键字进行分组
每组两个端点比较大小,头端点比尾端点大的话交换位置,否则不变
第一组【45,34,78,12,34】位置交换后变为:【34,34,78,12,45】
第二组【34,78,12,34,32】位置交换后变为:【32,78,12,34,34】
第三组【78,12,34,32,29】位置交换后变为:【29,12,34,32,78】
第四组【12,34,32,29,64】位置不变
第一轮分组后序列为
第二轮分组以2为关键字
每组两个端点比较大小,头端点比尾端点大的话交换位置,否则不变
第一组【34,32,29】位置交换后变为【29,32,34】
整体序列为 29, 32, 34, 12,45,34,78,64
第二组【32,34,12】位置交换后变为【12,34,32】
整体序列为 29, 12, 34, 32,45,34,78,64
第三组【34,32,45】保持不变
第四组【32,45,34】保持不变
第五组【45,34,78】保持不变
第六组【34,78,64】保持不变
即 29, 12, 34, 32,45,34,78,64
第三轮以1为关键字进行分组
【29,12】位置变换之后【12,29】
【29,34】位置不变
【34,32】位置变换之后【32,34】
【34,45】位置不变
【45,34】位置变化之后【34,45】
【45,78】位置不变
【78,64】位置变化之后【64,78】
最终序列为
12,29,32,34,34,45,64,78 至此排序完毕
java代码以【8,3,2,1,7,4,6,5】序列为例
package com.yonyou.test; /** * 内部排序算法之Shell排序 * 默认按照从小到大进行排序操作 */ public class Test{ public static void main(String[] args) { //需要进行排序的数组 int[] array=new int[]{8,3,2,1,7,4,6,5}; //输出原数组的内容 printResult(array); //shell排序操作 shellSort(array); //输出排序后的相关结果 printResult(array); } /** * shell排序算法 * 增量h=(h*3)+1; 这个增量公式是由Knuth给出的 * @param array */ private static void shellSort(int[] array) { //首先根据数组的长度确定增量的最大值 int h=1; // 按h * 3 + 1得到增量序列的最大值 while(h <= array.length / 3) { h = h * 3 + 1; } //进行增量查找和排序 while(h>0) { for(int i=h;i<array.length;i++) { for(int k=i;k<array.length;k+=h) { //判断是否需要重新排序,如果小于k-h处的值,需要重新排序 if(array[k]<array[k-h]) { int tempValue=array[k]; int j=k; for(;j>=i&&tempValue<array[j-h];j-=h) { array[j]=array[j-h]; } array[j]=tempValue; } } printResult(array); } h=(h-1)/3; } } /** * 输出相应数组的结果 * @param array */ private static void printResult(int[] array) { for(int value:array) System.out.print(" "+value+" "); System.out.println(); } /** * 交换数组中两个变量的值 * @param array * @param i * @param j */ private static void swap(int[] array,int i,int j){ int temp=array[i]; array[i]=array[j]; array[j]=temp; } }
算法分析
- 1.不稳定
- 2.空间代价θ(1)
- 3.时间代价θ(n²)
- 4.选择适当的增量序列,可以使得时间代价解决θ(n)
相关推荐
Shell排序,又称希尔排序,是插入排序的一...在提供的压缩包文件中,"shell算法"很可能是实现Shell排序的C程序代码。通过阅读和理解这段代码,你可以更深入地了解Shell排序的工作原理,并将其应用到实际的编程项目中。
K-shell 分解方法给出了节点重要性的一种粗粒化的划分。 其基本思想如下,假设边缘节点的 K-shell值为 1,然后往内一层层进入网络的核心,先去除网络 中度值等于 1 的所有节点以及连边。 若剩下的节点里面,仍有度值...
shell排序shell排序shell排序shell排序shell排序shell排序shell排序
基于python-2.7实现的K-Shell节点排序算法,算法结果输出每个节点K值。
根据k-shell算法,对网络进行划分,得到每一层的子网
鉴于当前众多方法在识别节点的不同影响力时存在一定局限性,因此在k-shell方法的基础上,通过度量边的潜在重要性,考虑邻居节点的差异贡献性,从而定义了节点的加权度概念,并提出了MKS(Modified k-shell)算法,该...
基于 K-shell 影响力最大化的路径择优计算迁移算法 概述: 移动边缘计算网络中,高效的计算迁移算法是移动边缘计算的重要问题之一。为了提高计算迁移算法性能,应用同类问题的相互转换性和最大化影响力模型,利用 K...
**Shell排序算法详解及其在Simotion中的应用** Shell排序,由美国计算机科学家Donald Shell于1959年提出,是一种改进的插入排序算法,通过设置一个间隔序列来减少比较和交换的操作,从而提高了排序的效率。它巧妙地...
本文将详细介绍C语言实现的冒泡Shell排序算法。 首先,冒泡排序(Bubble Sort)是一种简单直观的排序算法。它重复地遍历待排序的序列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历序列的工作是...
shell排序的c语言算法 很好很强大很高效很教授的算法
### C++中的Shell排序算法详解 #### 一、Shell排序简介 Shell排序是插入排序的一种扩展,由Donald Shell于1959年提出。它通过将原始数组分割成多个子序列,分别对这些子序列进行插入排序来提高插入排序的效率。随着...
由Donald Shell在1959年提出,它通过将待排序的数组元素按某个增量分组,然后对每组进行直接插入排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。这种排序...
Python手撕算法ShellSort
**ShellSort算法详解** ShellSort,又称希尔排序,是由美国计算机科学家Donald Shell于1959年提出的一种改进的插入排序算法。它通过将待排序的元素按照一定的间隔分组,然后对每组进行插入排序,随着间隔逐渐减小,...
这个试用shell实现的排序算法间大名了
python 排序算法之ShellSort
C语言排序法输出每趟结果.pdf...在函数中,使用 Shell 算法来实现希尔排序。最后,输出每趟的结果。 这篇文章提供了四种常见的排序算法的实现代码和输出每趟结果的演示,帮助读者更好地理解排序算法的原理和实现细节。
### 复杂网络算法中K-shell与介数中心性算法的实现 #### 一、引言 随着互联网技术的发展及社会结构的复杂化,复杂网络分析成为了一个热门的研究领域。复杂网络是由许多相互连接的节点构成的网络,这些节点可以是人...
C语言基本排序算法之shell排序实例 shell排序是一种高效的排序算法,它是对直接插入方法的改进方法。该算法的主要思想是将数组元素分组,使用gap间隔来比较元素,从而提高排序效率。 shell排序的主要特点是它并...