排序算法(Java语言)——希尔排序

来源:互联网 发布:转换成淘宝客链接 编辑:程序博客网 时间:2024/05/24 05:49

    希尔排序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 

0 0
原创粉丝点击