场景:
对数组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],