希尔排序之Java实现

希尔排序之Java实现

一、方法一

 1 package cn.com.zfc.lesson21.sort;
 2 
 3 /**
 4  * 
 5  * @title ShellSort
 6  * @describe 希尔排序 1959 年发明的
 7  * @author 张富昌
 8  * @date 2016年10月1日下午5:35:50
 9  */
10 public class ShellSort_1 {
11     // 希尔排序是对插入排序的一种改进。
12     // 基本思想:先将整个待排数据元素序列分割成若干个子序列,分别对各个子序列进行直接插入排序。
13     // 等整个序列中的数据元素“基本有序”时,在对整体元素进行一次直接插入排序
14     // 时间复杂度:O(n) ~ O(n^2)
15     public static void main(String[] args) {
16         // 声明整型数组
17         int[] array = new int[10];
18         // 使用循环和随机数初始化数组
19         for (int i = 0; i < array.length; i++) {
20             array[i] = (int) Math.round(Math.random() * 100);
21         }
22         System.out.println("原始数组为:");
23         for (int i : array) {
24             System.out.print(i + " ");
25         }
26         System.out.println();
27         System.out.println("排序后的数组为:");
28         array = shellSort(array);
29         for (int i : array) {
30             System.out.print(i + " ");
31         }
32     }
33 
34     /**
35      * 
36      * 功能:冒泡排序的变种,希尔排序的基本思想是:首先按照一个序列递减的方法逐渐进行排序
37      * 
38      * 参数:int[] array
39      *
40      * 返回类型:int[]
41      */
42     public static int[] shellSort(int[] array) {
43         // 使用临时数组,替代原始数组
44         int[] arr = array;
45         // 以增量 i进行直接插入排序
46         int gap = arr.length;
47         do {
48             gap = gap / 2;
49             for (int i = gap; i < arr.length; i++) {
50                 for (int j = i; j >= gap; j -= gap) {
51                     // 较小的数排在前面
52                     if (arr[j] < arr[j - gap]) {
53                         int temp = arr[j];
54                         arr[j] = arr[j - gap];
55                         arr[j - gap] = temp;
56                     } else {
57                         break;
58                     }
59                 }
60             }
61         } while (gap > 1);
62 
63         return arr;
64     }
65 }

运行结果:

二、方法二

 1 package cn.com.zfc.lesson21.sort;
 2 
 3 /**
 4  * 
 5  * @title ShellSort
 6  * @describe 希尔排序 1959 年发明的
 7  * @author 张富昌
 8  * @date 2016年10月1日下午5:35:50
 9  */
10 public class ShellSort_2 {
11     // 希尔排序是对插入排序的一种改进。
12     // 基本思想:先将整个待排数据元素序列分割成若干个子序列,分别对各个子序列进行直接插入排序。
13     // 等整个序列中的数据元素“基本有序”时,在对整体元素进行一次直接插入排序
14     // 时间复杂度:O(n) ~ O(n^2)
15 
16     public static void main(String[] args) {
17         // 声明整型数组
18         int[] array = new int[10];
19         // 使用循环和随机数初始化数组
20         for (int i = 0; i < array.length; i++) {
21             array[i] = (int) Math.round(Math.random() * 100);
22         }
23         System.out.println("原始数组为:");
24         for (int i : array) {
25             System.out.print(i + " ");
26         }
27         System.out.println();
28         System.out.println("排序后的数组为:");
29         array = shellSort(array);
30         for (int i : array) {
31             System.out.print(i + " ");
32         }
33     }
34 
35     /**
36      * 
37      * 功能:冒泡排序的变种,希尔排序的基本思想是:首先按照一个序列递减的方法逐渐进行排序
38      * 
39      * 参数:int[] array
40      *
41      * 返回类型:int[]
42      */
43     public static int[] shellSort(int[] array) {
44         // 使用临时数组,替代原始数组
45         int[] arr = array;
46         // 以增量 i进行直接插入排序
47         int gap = arr.length;
48         // 临时变量
49         int j, temp;
50         do {
51             gap = gap / 2;
52             for (int i = gap; i < arr.length; i++) {
53                 if (arr[i] < arr[i - gap]) {
54                     temp = arr[i];
55                     for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
56                         arr[j + gap] = arr[j];
57                     }
58                     arr[j + gap] = temp;
59                 }
60             }
61         } while (gap > 1);
62 
63         return arr;
64     }
65 }

运行结果:

 

posted @ 2017-12-01 11:14  勇闯天涯zfc  阅读(199)  评论(0编辑  收藏  举报