希尔排序

希尔排序

希尔排序是对插入排序的改进,通过减少增量的方式(分组),将数据逐步基本有序化,当增量为0时结束,从而提高插入排序的效率,减少插入的次数,也是第一个将突破O(n^2)的算法,但是希尔排序不是一个稳定的算法,最坏的情况的时候算法复杂度,比直接插入排序还要差,当数据量处于中等的时候效率较高,数据量小的时候效率低,。
在这里插入图片描述

这里采用的是Knuth的间隔序列 h=(h-1)/3

package com.yc.Pljq.sort;
/**
 * 希尔排序
 * @author 29226
 *
 */
public class ArraySh {
	public int[] MyArray;//排序数组
	public int elem;
	//初始化排序数组
	public ArraySh(int max) {
		if(max<0) {
			max=100;
		}
		MyArray =new int [max];
		
	}
	public ArraySh(int [] array) {
		
		MyArray =new int [array.length];
		MyArray=array;
		
	}
	//数组插入
	public void insert(int value) {
		MyArray[elem++]=value;
	}
	//查看
	public void display() {
		for(int i=0,n=MyArray.length;i<n;i++) {
			System.out.print(MyArray[i]+" ");
		}
		System.out.println();
	}
	//希尔排序
	public void ShellSort() {
		int h=1;//间隔(增量)
		//找出最大的增量
		while(h<=elem/3) {
			h=h*3+1;
		}
		int temp;
		int outer;//后置指针
		int inner;//前置指针
		//按照增量值去交换比较
		while(h>=1) {
			//控制躺数
			for(outer=h;outer<elem;outer++) {
				temp=MyArray[outer];
				inner=outer;
				//按照增量在分组的内部比较交换
				while(inner>h-1 && MyArray[inner-h]>=temp) {
					MyArray[inner]=MyArray[inner-h];
					inner-=h;
				}
				MyArray[inner]=temp;
				//display();
			}
			h=(h+1)/3;
		
		}
		
	}
	
	//测试
	public static void main(String [] rgs) {
		ArraySh sh=new ArraySh(10);
		sh.insert(6);
		sh.insert(2);
		sh.insert(7);
		sh.insert(4);
		sh.insert(8);
		sh.insert(3);
		sh.insert(10);
		sh.insert(9);
		sh.insert(5);
		sh.insert(1);
		sh.display();
		sh.ShellSort();
		sh.display();
		
	}
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值