希尔排序Shellsort的名称源于它的发明者Donald Shell,该算法是冲破二次时间屏障的第一批算法之一,不过,直到它最初被发现的若干年后才证明了它的亚二次时间界。它通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。由于这个原因,希尔排序有时也叫做缩减增量排序(diminishing increment sort)。
希尔排序使用一个序列h1,h2,...,h(t),叫做增量序列。只要h1=1,任何增量序列都是可行的,不过,有些增量序列比另外一些增量序列更好。在使用增量hk的一趟排序之后,对于每一个i我们都有a[i]<=a[i+h(k)];所有间隔h(k)的元素都被排序。此时称文件是h(k)排序的。希尔排序的一个重要性质是,一个h(k)排序的文件(然后将是h(k-1)排序的)保持它的hk排序性。
hk排序的一般做法是,对于h(k),h(k)+1,...,N-1中的每一个位置i,把其上的元素放到i,i-h(k),i-2h(k),...中的正确位置上。虽然这并不影响最终结果,但通过仔细观察可以发现,一趟h(k)排序的作用就是对h(k)个独立的子数组执行一次插入排序。当我们分析希尔排序的运行时间时,这个观察结果是很重要的。
增量序列的一个流行(但是并不好)的选择是使用Shell建议的序列:ht=N/2和hk=h(k+1)/2(向下取整)。以下是使用希尔增量的希尔排序的实现:
import java.util.Random; public class SortAlgorithm { /** * 希尔排序算法 * * @param array * 数组 */ public static <AnyType extends Comparable<? super AnyType>> void shellSort( AnyType[] array) { int j, count = 0; for (int gap = array.length / 2; gap > 0; gap /= 2) { // 希尔增量 for (int i = gap; i < array.length; i++) { AnyType tmp = array[i]; for (j = i; j >= gap && tmp.compareTo(array[j - gap]) < 0; j -= gap) { array[j] = array[j - gap]; System.out.print("Sort by " + gap + ": "); for (AnyType anyType : array) { System.out.print(anyType + " "); } System.out.println(); count++; } array[j] = tmp; } } System.out.println("Count:" + count); } public static void main(String[] args) { Integer[] list1 = new Integer[] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; for (int i = 0; i < 10; i++) { System.out.print(list1[i] + " "); } System.out.println(); shellSort(list1); System.out.println("After sorting:"); for (Integer integer : list1) { System.out.print(integer + " "); } System.out.println("\n---------------------"); Integer[] list2 = new Integer[10]; Random random = new Random(); for (int i = 0; i < 10; i++) { list2[i] = random.nextInt(10); System.out.print(list2[i] + " "); } System.out.println(); shellSort(list2); System.out.println("After sorting:"); for (Integer integer : list2) { System.out.print(integer + " "); } } }
9 8 7 6 5 4 3 2 1 0
Sort by 5: 9 8 7 6 5 9 3 2 1 0
Sort by 5: 4 8 7 6 5 9 8 2 1 0
Sort by 5: 4 3 7 6 5 9 8 7 1 0
Sort by 5: 4 3 2 6 5 9 8 7 6 0
Sort by 5: 4 3 2 1 5 9 8 7 6 5
Sort by 2: 4 3 4 1 0 9 8 7 6 5
Sort by 2: 2 3 4 3 0 9 8 7 6 5
Sort by 2: 2 1 4 3 4 9 8 7 6 5
Sort by 2: 2 1 2 3 4 9 8 7 6 5
Sort by 2: 0 1 2 3 4 9 8 9 6 5
Sort by 2: 0 1 2 3 4 7 8 9 8 5
Sort by 2: 0 1 2 3 4 7 6 9 8 9
Sort by 2: 0 1 2 3 4 7 6 7 8 9
Count:13
After sorting:
0 1 2 3 4 5 6 7 8 9
---------------------
9 7 2 6 3 4 1 9 2 5
Sort by 5: 9 7 2 6 3 9 1 9 2 5
Sort by 5: 4 7 2 6 3 9 7 9 2 5
Sort by 5: 4 1 2 6 3 9 7 9 6 5
Sort by 2: 4 1 4 2 3 9 7 9 6 5
Sort by 2: 2 1 4 2 4 9 7 9 6 5
Sort by 2: 2 1 3 2 4 9 7 9 7 5
Sort by 2: 2 1 3 2 4 9 6 9 7 9
Sort by 2: 2 1 3 2 4 9 6 9 7 9
Sort by 1: 2 2 3 2 4 5 6 9 7 9
Sort by 1: 1 2 3 3 4 5 6 9 7 9
Sort by 1: 1 2 2 3 4 5 6 9 9 9
Count:11
After sorting:
1 2 2 3 4 5 6 7 9 9
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zhang_zp2014/article/details/47815967