希尔排序之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 }
运行结果: