码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构之高级排序算法

时间:2016-04-23 23:02:37      阅读:426      评论:0      收藏:0      [点我收藏+]

标签:

一、希尔排序

希尔排序(缩小增量法) 属于插入类排序,由Shell提出,希尔排序对直接插入排序进行了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增量,习惯上用字母h来表示这个增量。

具体代码实现:

 1 package data.struct.algorithm;
 2 
 3 //高级排序算法之希尔排序
 4 class ArraySh {
 5     private int[] arr;
 6     private int nItems;
 7 
 8     public ArraySh(int maxSize) {
 9         arr = new int[maxSize];
10         nItems = 0;
11     }
12 
13     public void insert(int value) {
14         arr[nItems++] = value;
15     }
16 
17     // 显示数组内容
18     public void displayArr() {
19         for (int j = 0; j < nItems; j++) {
20             System.out.print(arr[j] + " ");
21         }
22         System.out.println();
23     }
24 
25     // 希尔排序
26     public void shellSort() {
27         // h的定义是:希尔排序的增量值
28         int h = 1;
29         int temp;
30         int j;
31         // 记录排序的次数
32         int times = 0;
33         /*
34          * 常用的h序列由Knuth提出,该序列从1开始,通过如下公式产生: h = 3 * h +1 ;反过来程序需要反向计算h序列,应该使用
35          * h=(h-1)/3
36          */
37         while (h < nItems / 3) {
38             h = 3 * h + 1;
39         }
40         while (h > 0) {
41             // 每个相同增量的子序列,希尔排序与直接插入排序的结合
42             for (int i = h; i < nItems; i += h) {
43                 if (arr[i] < arr[i - h]) {
44                     temp = arr[i];
45                     j = i - h;
46                     while (j >= 0 && arr[j] > temp) {
47                         arr[j + h] = arr[j];
48                         j -= h;
49                     }
50                     arr[j + h] = temp;
51                     System.out.println("第" + (++times) + "次排序");
52                     displayArr();
53                 }
54             }
55             // 计算下一个h的值
56             h = (h - 1) / 3;
57         }
58     }
59 }
60 
61 public class ShellSortTest {
62 
63     /**
64      * @param args
65      */
66     public static void main(String[] args) {
67         int maxSize = 10;
68         ArraySh arraySh = new ArraySh(maxSize);
69         for (int j = 0; j < maxSize; j++) {
70             // 随机产生数组的元素
71             arraySh.insert((int) (Math.random() * 99));
72         }
73         arraySh.displayArr();
74         System.out.println("---希尔排序步骤--");
75         arraySh.shellSort();
76     }
77 
78 }

运行结果:

15 42 58 60 78 98 68 3 25 46 
---希尔排序步骤--
第1次排序
15 42 58 60 25 98 68 3 78 46 
第2次排序
15 25 42 58 60 98 68 3 78 46 
第3次排序
15 25 42 58 60 68 98 3 78 46 
第4次排序
3 15 25 42 58 60 68 98 78 46 
第5次排序
3 15 25 42 58 60 68 78 98 46 
第6次排序
3 15 25 42 46 58 60 68 78 98 

希尔排序的效率分析

上面程序在和直接插入法比较,会发现其与直接插入排序的差别在于:直接插入排序中的h会以1代替

Shell排序是不稳定的排序算法,它的空间复杂度是O(1),时间开销估计在O(N3/2)~O(N7/6)之间

数据结构之高级排序算法

标签:

原文地址:http://www.cnblogs.com/ysw-go/p/5425794.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!