`
韩悠悠
  • 浏览: 828450 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

希尔排序

 
阅读更多

希尔排序

 *尔排序属于插入类排序,是将整个有序序列分割成若干小的子序列分别进行插入排序。
 *排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,
 *重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。
 *
 *希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,
 *速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。
 *所以,希尔排序的时间复杂度会比o(n^2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,
 *不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,
 *最后其稳定性就会被打乱,所以shell排序是不稳定的。

 

package com.algorithm;

/**
 * 希尔排序
 * @author lenovo
 *尔排序属于插入类排序,是将整个有序序列分割成若干小的子序列分别进行插入排序。
 *排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,
 *重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。
 *
 *希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,
 *速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。
 *所以,希尔排序的时间复杂度会比o(n^2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,
 *不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,
 *最后其稳定性就会被打乱,所以shell排序是不稳定的。
 */
public class ShellSort {

	/**
	 * 排序方法
	 */
	public static void sort(long[] attr){
		//初始化一个间隔
		int h=1;
		//计算最大间隔
		while (h<attr.length/3) {
			h=h*3+1;
		}
		while(h>0){
			//进行插入排序
			long temp=0;
			for (int i = h; i < attr.length; i++) {
				temp =attr[i];
				int j=i;
				while (j>h-1&&attr[j-h]>=temp) {
					attr[j]=attr[j-h];
					j =j-h;
				}
				attr[j]=temp;
			}
			//减小间隔
			h=(h-1)/3;
		}
	}
	
	public static void main(String[] args) {
		long[] attr = new long[5];
		attr[0]=34;
		attr[1]=23;
		attr[2]=2;
		attr[3]=55;
		attr[4]=1;
		
		System.out.print("{");
		for (int i = 0; i < attr.length; i++) {
			System.out.print(attr[i]+" ");
		}
		System.out.println("}\n");
		
		sort(attr);
		
		System.out.print("{");
		for (int i = 0; i < attr.length; i++) {
			System.out.print(attr[i]+" ");
		}
		System.out.println("}\n");
	}
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics