java实现希尔排序

介绍

希尔排序是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。其平均时间复杂度突破了O(n^2),为O(nlogn)。
插入排序一般来说是低效的,希尔排序解决了插入排序每次只能将数据移动一位的情况,可以把较小的数据快速移动到其正确的位置。
希尔排序以一定增量对序列进行分组,分组排序后,增量减半,再次进行排序,直至增量为1,排序完成。
图解如下
在这里插入图片描述

交换法实现

交换法是把分组中元素与相邻元素相比较,并进行交换。

public class ShellSort {
	public static void shellSort(int [] arr) {
		//交换法
		int temp=0;
		int k=0;
		//把数据分组,每次分组的步长减少
		for(int order=arr.length/2;order>0;order/=2) {
		    //order为增量
			//从分组的最后一个开始往前比较
			for(int i=order;i<arr.length;i++) {
				//把分组排好序
				for(int j=i-order;j>=0;j-=order) {
					if(arr[j]>arr[j+order]) {
						temp=arr[j];
						arr[j]=arr[j+order];
						arr[j+order]=temp;
					}
				}
			}
			System.out.println("第"+(++k)+"轮排序结果:"+Arrays.toString(arr));
		} 
 public static void main(String[] args) {
		int [] arr= {8,9,1,7,2,3,5,4,6,0};
		//对于后面又较小数据的排序有较高效率
		shellSort(arr);
	}
}

实现结果
在这里插入图片描述

移动法实现

移动法为在分组中排序为插入法,从分组的最后一个寻找到正确的位置后,进行交换。移动法比交换法的效率是更高的,减少了数据的交换次数。

public class ShellSort {
	//优化,移位法
	public static void shell2Sort(int [] arr) {
			//交换法
			int temp=0;
			int k=0;
			//把数据分组,每次分组的步长减少
			for(int order=arr.length/2;order>0;order/=2) {
			    
				//从分组的最后一个开始往前比较
				for(int i=order;i<arr.length;i++) {
					//把分组排好序
					int j=i;
					temp=arr[j];
					if(temp<arr[j-order]) {  //如果比步长前一个小
						while(j-order>=0&&temp<arr[j-order]) {   //往前找插入的位置
							arr[j]=arr[j-order];
							j=j-order;
						 }
					  }
					arr[j]=temp;	
					}
				System.out.println("第"+(++k)+"轮排序结果:"+Arrays.toString(arr));
				}
			}
	public static void main(String[] args) {
		int [] arr= {8,9,1,7,2,3,5,4,6,0};
		//对于后面又较小数据的排序有较高效率
		shell2Sort(arr);
	}
	}

实现结果
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值