@TOC
1、介绍
也是插入排序,简单的插入排序之后的一个更高效的版本
2、实现思路
把记录安下标的一定增量分组(数组长度的一半),对每组使用插入排序算法排序,随着增量逐渐减少(就是数组长度的一半的一半这样计算),每组包含的数据越来越多,当增量减到1时(数组长度一半的一半为1时),整个数组被分为一组,排序完成
3、代码实现
package com.lyw.review510;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int[] arr = {10, 1, 2, 3, 4, 5, 6};
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void shellSort(int[] arr) {
// 给gap赋值并逐步缩小增量
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
// 从第gap元素开始逐个对其所在的组进行直接插入排序
for (int i = gap;i < arr.length; i++) {
// 记录当前待插入值的索引,防止修改i的值
int insertIndex = i;
// 记录当前待插入的值
int insertValue = arr[insertIndex];
// 如果当前值小于前面的值才进行比较
if (insertValue < arr[insertIndex - gap]) {
// insertIndex - gap >= 0 如果当前索引减去步长之后小于0,说明前面已经没有要比较的数据了
// insertValue < arr[insertIndex - gap] 在前面还有待比较数据前提下,比较前面的数据跟待插入数据的值
// 小,则将前面的数据移到当前位置,在切换到前面的索引,进行下一轮比较
while (insertIndex - gap >= 0 && insertValue < arr[insertIndex - gap]) {
// 将arr[insertIndex - gap]的值向后移动一个步长,此时arr[insertIndex - gap]位置上没有数据
arr[insertIndex] = arr[insertIndex - gap];
// 切换到arr[insertIndex - gap]数据的索引位置判断前面的元素是否数据,然后进行比较大小
insertIndex -= gap;
}
// while循环结束后,因为小的数据都后移了,所以当前insertIndex索引就用来保存待插入的值
// 不经过while循环时,说明当前insertIndex索引下的数据比前面的数据大,所以就不需要动了
// 此时前面没有数据||前面的数据比当前待插入的数据还要小,这是的insertIndex索引已经指向了要插入的位置
// 插入数据
if (insertIndex != i)
{
arr[insertIndex] = insertValue;
}
}
}
}
}
}
仅供参考