算法回顾系列第五篇:希尔排序
---------------------------------------
希尔排序(缩小增量排序)
基本原理:
该方法实质上是一种分组插入排序方法,属于直接插入排序的改进算法。
比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。
算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d。
对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。
当增量减到1时,整个要排序的数被分成一组,排序完成。
(一般初次取序列一半为增量,然后每次减半,直到增量为1。)
程序实现:
public void sort(int[] data) {
//初次取序列长度一半为增量(相隔距离),以后每次减半,直到增量为1.
for(int i=data.length/2;i>2;i/=2){//i为增量,若大于2,则每次递减一半.
//每次增量缩小后都需要从头进行一次排序.
for(int j=0;j<i;j++){
insertSort(data,j,i);//起始为0,增量不为1的插入排序.
System.out.println("after insert sort:"+Arrays.toString(data));
}
System.out.println("sort:"+Arrays.toString(data));
}
insertSort(data,0,1);//起始为0,增量是1的直接插入排序.
System.out.println("after final sort:"+Arrays.toString(data));
}
/**
* 与直接插入排序实现类似,只不过增量不一定为1(不是相邻元素交换位置).
* @param data 待排序数组
* @param start 起始位置
* @param inc 增量
*/
private void insertSort(int[] data, int start, int inc){
int temp;
for(int i=start+inc;i<data.length;i+=inc){
for(int j=i;(j>=inc)&&(data[j]<data[j-inc]);j-=inc){
temp = data[j];
data[j] = data[j-inc];
data[j-inc] = temp;
//System.out.println("after swap:"+Arrays.toString(data));
}
}
}
public static void main(String[] args){
int[] data = new int[]{12,11,10,9,8,7,6,5,4,3,2,1};
new ShellSort().sort(data);
System.out.println(Arrays.toString(data));
}
上面程序中:
一共12个元素,增量分别为6,3,1.
第一次以6为增量分组,每组元素(相差距离为6)进行直接插入排序。
第二次以3为增量分组,每组元素(相差距离为3)进行直接插入排序。
最后以1为增量分组(即全部元素),进行一次直接插入排序。
性能分析:
平均时间复杂度 O(nlogn),最差时间复杂度O(n^2)。
空间复杂度:1。
稳定性:不稳定。
分享到:
相关推荐
本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...
本主题将详细探讨希尔排序、冒泡排序、堆排序等经典的排序算法,这些都是数据结构与算法学习中的核心内容,尤其对于北邮数据结构课程来说,理解并掌握这些排序方法至关重要。 1. **插入排序**: 插入排序是一种...
本文将详细探讨十种经典的排序算法在C++中的实现,分别是冒泡排序、桶排序、计数排序、堆排序、插入排序、合并排序、快速排序、基数排序、选择排序和希尔排序。 1. **冒泡排序**:冒泡排序是最简单的排序算法之一,...
(1) 完成5种常用内部排序算法的演示,5种排序算法为:快速排序,直接插入排序,选择排序,堆排序,希尔排序; (2) 待排序元素为整数,排序序列存储在数据文件中,要求排序元素不少于30个; (3) 演示程序开始,...
4. 时间复杂度分析:希尔排序的时间复杂度并不像其他排序算法那样有明确的上界,因为它依赖于增量序列的选择。在最好的情况下,时间复杂度可达到O(n log n),但在最坏情况下,时间复杂度可能接近O(n^2)。尽管如此,...
希尔排序是基于插入排序的,但通过间隔序列(增量序列)来优化了插入排序的时间复杂度。 希尔排序的主要步骤如下: 1. **选择增量序列**:首先,我们需要一个增量序列{h1, h2, ..., hk},其中hi > hj 当 i ,k 是...
这七种算法分别是:冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序和快速排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,通过重复遍历待排序序列,比较相邻元素并交换位置来实现排序...
十大经典排序算法的实现:快速排序、堆排序、希尔排序、插入排序、冒泡排序、选择排序、归并排序、计数排序_SortAlgorithms
希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的...理解希尔排序的原理,并根据实际情况选择合适的增量序列,可以帮助我们更好地利用这种排序算法。
这里我们关注的是六种经典的排序算法:快速排序、选择排序、冒泡排序、希尔排序、插入排序以及懒人排序。这六种算法都是使用C语言实现的,因此对C编程有一定的基础要求。 1. **快速排序**:由英国计算机科学家C.A.R...
希尔排序(Shell Sort)是一种基于插入排序的快速排序方法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的间隔进行分组,然后对每组...对于学习和理解排序算法,希尔排序是不可或缺的一部分。
内容概要:希尔排序作为一种高效的改进型插入排序算法被详细介绍,主要内容涵盖希尔排序的基本概念,具体排序过程及其实现细节。文章还提供了希尔排序在不同编程语言环境(C++, C)中的实例代码实现,详细介绍了其执行...
本资源介绍了六种常用的排序算法:选择排序、直接插入排序、冒泡排序、希尔排序、快速排序和堆排序。下面对每种算法进行详细介绍: 选择排序 选择排序是一种简单的排序算法。其思想是:在要排序的一组数中,选出...
总结,希尔排序是介于简单排序与高级排序之间的一种算法,通过合理设计增量序列,可以在一定程度上提升排序速度,适合处理大数据量的排序问题。在实际编程中,根据数据特点选择合适的增量序列是优化希尔排序的关键。
实验7: 内部排序算法比较.doc 实验7: 内部排序算法比较.doc 实验7: 内部排序算法比较.doc
以下是关于"插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序"这十大经典排序算法的详细解释: 1. 插入排序:插入排序是一种简单的排序算法,它通过构建有序...
希尔排序是一种比较实用的排序算法,虽然它不是稳定的排序算法(即相等的元素可能会改变原有的相对顺序),但其效率在许多情况下优于其他简单的排序算法,特别是在处理大规模数据时。在编程实践中,理解并掌握希尔...
总的来说,希尔排序是通过增量分组优化了直接插入排序的过程,提高了对大规模数据的排序效率,而选择排序则是一种简单直观但效率较低的排序算法。在实际应用中,希尔排序因其较高的效率和相对简单的实现,被广泛用于...
本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年提出,是一种改进的插入排序。它的基本思想是通过设置一个增量序列,将待排序的元素按照...