Java实现插入排序之希尔排序

1.希尔排序基本思想

         希尔排序(Shell Sort)插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。

希尔排序是非稳定排序算法。该方法因DLShell1959年提出而得名。希尔排序是把记录按下标的一定增量 分组,

对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,

 整个文件恰被分成一组,算法便终止。

 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量

 
=1(
   
<
   
…<d2<d1) ,即所有记录放在同一组中进行直接插入排序为止。

该方法实质上是一种分组插入方法

比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比[2]  较就可能消除多个元素交换。D.L.shell1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

一般的初次取序列的一半为增量,以后每次减半,直到增量为1

给定实例的shell排序的排序过程

假设待排序文件有10个记录,其关键字分别是:

49386597761327495504

增量序列的取值依次为:

521

排序过程如下:


二.希尔排序Java实现代码

public class ShellSort {

	public static void main(String[] args) {
		int[] aa={8,4,6,1,9,3,25,14,18,16};
		System.out.println("排序前:");
		/*for (int i : aa) {
			System.out.println(i+" ");
		}*/
		System.out.println(Arrays.toString(aa));
		System.out.println();
		shellSort(aa);
		
		System.out.println("排序后:");
		/*for (int i : aa) {
			System.out.println(i+" ");
		}*/
		System.out.println(Arrays.toString(aa));
	}

	private static void shellSort(int[] aa) {
		int gap=aa.length/2;
		
		while(gap>=1){
			
			for(int k = 0; k < gap; k++) {  
                for(int i = k+gap;i < aa.length; i+=gap) {  
                    for(int j = i - gap;j>= k; j-=gap) {  
                        if(aa[j] >aa[j+gap]) {  
                            int temp=aa[j];  
                            aa[j]=aa[j+gap];  
                            aa[j+gap]=temp;  
                        }else{  
                            break;  
                        }  
                    }  
                }  
            } 
			
			gap=gap/2;
		}
		
	}
	
	

}

运行结果如下:

排序前:
[8, 4, 6, 1, 9, 3, 25, 14, 18, 16]

排序后:
[1, 3, 4, 6, 8, 9, 14, 16, 18, 25]

3.希尔排序的性能

平均时间复杂度:希尔排序的时间复杂度和其增量序列有关系,这涉及到数学上尚未解

决的难题;不过在某些序列中复杂度可以为O(n1.3); 

空间复杂度:O(1) 

稳定性:不稳定


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值