Java实现希尔(Shell)排序

import java.text.SimpleDateFormat;
import java.util.Date;

public class ShellSort
{
	private long[] arr;	//要排序的数组
	private int size;	//初始化数组大小
	private int length;	//数组实际大小(即有多少个值)
	
	public ShellSort(int size){
		this.arr=new long[size];
		this.size = size;
		length = 0;
	}
	//往数组添加值
	public void add(long value){
		if(length < size)
			arr[length++] = value;
	}
	//打印
	public void display(){
		for(int i=0; i<length; i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println(" ");
	}
	//交换数组两个位置的数据
	public void swap(int left, int right){
		long tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
	}
	
	
	/**
	 * 取数组最后一个数作为"中间值",将数组分成比"中间值"小和比"中间值"大的两部分
	 * 将"中间值"交换到两部分数据的中间位置
	 * 然后对"中间值"两边的数组,递归的执行该操作...
	 * @param left
	 * @param right
	 */
	public void sort(){
		int count = 0;
		while(count<length){
			count = count*3+1;
		}
		int interval = (count-1)/3;
		//逐渐减小增量,直到最后=1
		while(interval>=1){
			//从0开始以interval为增量的等差数列,进行插入排序
			//从1开始以interval为增量的等差数列,进行插入排序
			//...
			//从interval-1开始以interval为增量的等差数列,进行插入排序
			//确保所有数据都进行了排序
			for(int i=0; i<interval; i++){
				int j=1;
				//依次将数据一个个插入前面已排序的序列中;相对于第二个数来说,第一个数就是已排序好的序列
				while((i+j*interval)<length){
					int tmpj = j;
					long tmp = arr[i+j*interval];
					while(--tmpj>=0 && arr[i+tmpj*interval]>tmp){
						arr[i+tmpj*interval+interval]=arr[i+tmpj*interval];
					}
					arr[i+tmpj*interval+interval]=tmp;
					j++;
				}
			}
			
			interval = (interval-1)/3;
		}
	}
	
    public static void main(String[] args){
    	ShellSort sort = new ShellSort(1000000);
    	for(int i=0; i<1000000; i++){
    		sort.add((long)(Math.random()*100));
    	}
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ms");
    	System.out.println(sdf.format(new Date()));
    	//sort.display();
    	sort.sort();
    	//sort.display();
    	System.out.println(sdf.format(new Date()));
    }
}


--------------------------------------------------------------------------------

希尔排序和快速排序的效率比较对于无序数组,【希尔排序】完胜【快速排序】(当然也可能本人算法实现的不好)

用本人写的代码进行测试------------

100w随即无序数组     希尔排序:1ms完成     快速排序6s完成

1000w随即无序数组   希尔排序:5s完成        快速排序好几分钟还没完成(没耐心等了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值