JAVA 希尔排序-移位法 算法(详细实现过程介绍)

场景:
对数组int []arr={8,9,1,7,2,3,5,4,6,0},使用 希尔排序-移位法 排序方式实现从小到大排序。

思路分析:
4个数,外层循环需要排序三轮,即:循环从1开始,循环次数为 数组的长度

第一轮,第1次
8,9,1,7,2,3,5,4,6,0
gap=5
preIndex=0
insertVal=arr[5]
arr[preIndex]=arr[0]
如果当前数字小于前一个数字,即arr[5]<arr[0],则while循环,条件为,preIndex>=0且arr[5]<arr[0]满足,
则把下标为preIndex的元素的下一个元素,即下标为preIndex+5对应元素的值赋值为下标为preIndex的元素对应的值,arr[5]=arr[0],即arr[5]=8
同时,移动preIndex,步长为5,则preIndex=0-5=-5,不满足while循环条件,退出循环
此时数组为[8,9,1,7,2,8,5,4,6,0],preIndex=-5,成功找到insertVal的插入位置,即下标为 preIndex+5的位置
arr[-5+5]=insertVal=3
第一轮,第1次排序结果为:[3,9,1,7,2,8,5,4,6,0]


第一轮,第2次
[3,9,1,7,2,8,5,4,6,0]
gap=5,i=6
int preIndex = 6-5=1;
int insertVal = arr[6]=5;
arr[preIndex]=arr[1]=9
如果当前数字小于前一个数字,即arr[6]<arr[1],则while循环,条件为,preIndex>=0且arr[6]<arr[1]满足,
则把下标为preIndex的元素的下一个元素,即下标为preIndex+5对应元素的值赋值为下标为preIndex的元素对应的值,arr[6]=arr[1],即arr[6]=9
同时,移动preIndex,步长为5,则preIndex=1-5=-4,不满足while循环条件,退出循环
此时数组为[3,9,1,7,2,8,9,4,6,0],preIndex=-5,成功找到insertVal的插入位置,即下标为 preIndex+5的位置
arr[-4+5]=insertVal=5
第一轮,第2次排序结果为:[3,5,1,7,2,8,9,4,6,0]


第一轮,第3次
[3,5,1,7,2,8,9,4,6,0]
gap=5,i=7
int preIndex = 7-5=2;
int insertVal = arr[7]=4;
arr[preIndex]=arr[2]=1
arr[7]>arr[2],不满足插入条件,数组内部元素位置无任何变化,
第一轮,第3次排序结果仍为:[3,5,1,7,2,8,9,4,6,0]

第一轮,第4次
[3,5,1,7,2,8,9,4,6,0]
gap=5,i=8
int preIndex = 8-5=3;
int insertVal = arr[8]=6;
arr[preIndex]=arr[3]=7

如果当前数字小于前一个数字,即arr[8]<arr[3],则while循环,条件为,preIndex>=0且arr[8]<arr[3]满足,
则把下标为preIndex的元素的下一个元素,即下标为preIndex+5对应元素的值赋值为下标为preIndex的元素对应的值,arr[8]=arr[3],即arr[8]=7
同时,移动preIndex,步长为5,则preIndex=3-5=-2,不满足while循环条件,退出循环
此时数组为[3,5,1,7,2,8,9,4,7,0],

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值