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

希尔排序

时间:2015-08-20 22:39:28      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:希尔排序   java   排序算法   算法   

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

希尔排序

标签:希尔排序   java   排序算法   算法   

原文地址:http://blog.csdn.net/zhang_zp2014/article/details/47815967

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