首页 > 编程语言 > 详细

基础排序算法:希尔排序

时间:2015-10-23 18:44:03      阅读:258      评论:0      收藏:0      [点我收藏+]

一、原理:

  希尔排序的思想是使数组中任意间隔为h的的元素都是有序的,这样的数组被称为h有序数组。

 

  1、将无序数组按照若定的增量h分割为若干个子序列,然后对各个子序列进行插入排序。

  2、然后再选择一个更小的增量,再将数组分割为多个子序列进行排序。

  3、如此类推,最后选择增量为1(即直接插入排序),使最终数组成为有序。

  技术分享

 

  如图上半部分,当h=4时,此系列字符串就由分成四个有序数组(L—M—P—T), (E—H—S—S),(E—L—O—X),(A—E—L—R)

 

二、实现:

  希尔排序的实现类似于插入排序,只是使用不同的增量。

  1、java部分实现(通过Comparable接口):

 1 public class Shell
 2 {
 3     private static boolean less(Comparable v, Comparable w)
 4     {    
 5         //compareTo检测v是否小于w,为真返回负,为假返回正,相等返回零
 6         return v.compareTo(w) < 0;
 7     }
 8     
 9     private static void exch(Comparable[] a, int i, int j)
10     {
11         //交换元素位置
12         Comparable t = a[i];
13         a[i] = a[j];
14         a[j] = t;
15     }
16     
17     public static void sort(Comparable[] a)
18     {
19         int N = a.length; //数组长度
20         int h = 1;  // 增量
21         while (h < N/3)  //设定增量h的初始值,为数组长度乘以一个常数因子,最小为1
22             h = 3 * h + 1; //1, 4, 13, 40, 121, 364, 1093
23         while (h >= 1)
24         {    //排序
25             for (int i = h; i < N; i++)  
26                 for (j = i; j >= h && less(a[j], a[j-h]); j -= h) // 分组进行比较, 注意递减量
27                     exch(a, j, j - h);
28             h = h / 3;   //缩小增量
29         }
30     }
31 }

 

 

  2、python实现:

 1 def Shell(a):
 2     h = 1
 3     length = len(a)
 4     while h < length / 3:
 5         h = 3 * h + 1
 6     while h >= 1:
 7         for i in range(h, length):
 8             j = i
 9             while j >= h and a[j] < a[j-h]:
10                 a[j], a[j-h] = a[j-h], a[j]
11                 j = j - h
12         h = h // 3

 

三、特点:

  1、希尔算法的运行时间达不到N2级别(如以上算法的比较次数和N3/2成正比)

  2、希尔算法的代码量少,且不会使用额外内存空间。

基础排序算法:希尔排序

原文:http://www.cnblogs.com/SlientGuest/p/4904588.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!