希尔排序(移动法)|缩小增量排序

@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;
          }
        }
      }
    }
  }
}

仅供参考

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值