算法学习之希尔排序的简洁实现

Java 代码实现:
 1     @Test
 2     public void ShellSort(){
 3
 4         int[] array={9,8,7,6,5,4,3,2,1};
 5         int j,temp;
 6
 7         System.err.println(Arrays.toString(array));
 8         //gap为步长,每次取半
 9         for(int gap=array.length/2;gap>0;gap/=2){
10             for(int i=gap;i<array.length;i++){
11                 temp=array[i];
12                 //第三个循环为每个步长的分组进行排序,算法和插入排序一样
13                 for(j=i;j>=gap && temp-array[j-gap]<0;j-=gap)
14                     array[j]=array[j-gap];
15                 array[j]=temp;
16                 System.err.println(Arrays.toString(array));
17             }
18         }
19     }


算法的时间复杂度最坏为O(N2)
				
时间: 2024-10-13 01:25:02

算法学习之希尔排序的简洁实现的相关文章

算法学习-02(希尔排序,计数排序,桶排序,基数排序)

希尔排序 # 希尔排序 # 希尔排序是对插入排序的升级改造 # 它的大致流程是 # 1.将长度为n的序列 分为d = n//2组 # 2.使每一组变的有序 # 3.将序列分为 d1 = d // 2 组 # 4.将每一组变的有序 # 5.直到最后 d 小于等于 0 def inster_sort_gap(li,gap): for i in range(gap,len(li)): tmp = li[i] j = i - gap while j >= 0 and tmp > li[j]: li[j

排序算法学习之希尔排序

直接插入排序对待排数量较少且基本有序的序列,其执行效率是非常高的,希尔排序正是利用了这点,将一个无序的序列拆分成几个子组,然后对几个子组分别进行插入排序. 注意,这儿的分组并不是简单的{a1,a2,a3,b1,b2,b3,c1,c2,c3}(相同字母为一组),而是进行{a1,b1,c1,a2,b2,c2,a3,b3,c3},因为我们一次分组排序的目的是将各个子组中较小的放到整个序列前面,较大的放到整个序列后面,以形成基本有序,然后减少分组数量{a1,b1,a2,b2,a3,b3,a4,b4,a5

(转) 白话经典算法系列之三 希尔排序的实现(附源代码实现)

链接:http://blog.csdn.net/morewindows/article/details/6668714 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率

白话经典算法系列之三 希尔排序的实现

分类: 白话经典算法系列 2011-08-08 11:41 47406人阅读 评论(46) 收藏 举报 算法shell优化c 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的 元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为 直接插入排序在元素基本有序的情况下(接近最好情

算法系列【希尔排序】篇

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 关于时间复杂度: 1.     平方阶 (O(n2)) 排序各类简单排序:直接插入.直接选择和冒泡排序. 2.     线性对数阶 (O(nlog2n)) 排序快速排序.堆排序和归并排序: 3.     O(n1+§))排序,§ 是介于 0 和 1 之间的常数.希尔排序 4.     线性阶 (O(n)) 排序基数排序,此外还有桶.箱排序. 关于稳定性: 稳定的排序算法:冒泡排序

算法基础之希尔排序

希尔排序的实质就是分组插入排序, 是对直接插入排序的改进. 时间复杂度为O(nlongn), 跟快速排序, 堆排序的时间复杂度相同, 是一种较为快速的排序方式. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的 元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为 直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提

Java排序算法(四):希尔排序

[基本思想] 将原本有大量记录数的记录进行分组,分割成若干个子序列,此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,再对全体记录进行一次直接插入排序. 所谓的基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间,像{2, 1, 3, 6, 4, 7, 5, 8, 9}这样可以称为基本有序了. [java实现] public class ShellSort { public static void main(String

排序算法总结之希尔排序

一,希尔排序算法介绍 ①希尔排序又称缩小增量排序 ,它本质上是一个插入排序算法.为什么呢? 因为,对于插入排序而言,插入排序是将当前待排序的元素与前面所有的元素比较,而希尔排序是将当前元素与前面增量位置上的元素进行比较,然后,再将该元素插入到合适位置.当一趟希尔排序完成后,处于增量位置上的元素是有序的. ②希尔排序算法的效率依赖于增量的选取 假设增量序列为 h(1),h(2).....h(k),其中h(1)必须为1,且h(1)<h(2)<...h(k) . 第一趟排序时在增量为h(k)的各个元

排序算法(二)之希尔排序

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然