常见排序算法之希尔排序算法

1.希尔排序简介
1.介绍:
     希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”,
      是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法

2.核心思想:
	希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;
	随着增量逐渐减少,每组包含的关键词越来越多,
	当增量减至1时,整个文件恰被分成一组,算法便终止
	
3.空间复杂度:O(1)

4.时间复杂度 ;O(n^(1.3—2))

5.特点:
 	希尔排序是一种优秀的排序
 	比冒泡排序大概块五倍
 	比插入排序大概块两倍
 	比QuickSort,MergeSort,HeapSort慢很多
 	适合5000以下的数据量
 6.排序正确率问题
   希尔排序是一种不稳定排序,排序正确率取决于增量d递减的速度。
   d递减的越慢,正确率越高,d递减的越快正确率越低

2.思路梳理

注意:关于这里我们对于增量的选取问题,我在知乎上看过一篇论文课题是有关于增量和效率的关系,文中写“我们认为第k躺排序扫描的增量步长为2^k - 1 效率比较理想”,论坛上也有人说使用素数效率比较高。不过我认为如果想提高效率,换一种排序方式就可以了,增量对于效率的影响还是比较小的。
在这里插入图片描述


3.代码实现

这里要注意的是就是哪个for循环

public class ShellSort {
	
	public static void main(String[] args) {
		
		//定义数组
		int[] a = {48,85,99,145,14,1,78,23,66,99,845,1024};
		
		//数组长度
		int length = a.length;
		
		//初始增量长度
		int d = length/2;
		
		//开始排序
		while(true) {
			//分组后进行比较
			//每组第一个比较,每组第二个比较...
			for(int i = 0;i < d;i ++) {
				//这里要考虑的是
				//将若干个组的第一个,第二个做比较
				for(int j = 0;j + d < length;j += d) {
					//判断前一个值 与 后一个值的大小关系
					if (a[j] > a[j + d]) {
						int temp = a[j];
						a[j] = a[j + d];
						a[j + d] = temp;
					}
				}
			}
			
			//判断是否结束循环
			if (d == 1) {
				break;
			}
			
			//这里由于数比较小让b递减1
			d -= 1;
		}
		
		//打印数组
		System.out.println(Arrays.toString(a));
		 
			
		
	}
	
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值