【排序算法】04-希尔排序(也是一种插入排序)

本文深入解析了希尔排序算法,包括其思想、实现过程及代码示例。通过交换法和移位法两种不同方式实现希尔排序,展示了算法的逐步推导过程,并提供了完整的Java代码实现。

一、介绍

在这里插入图片描述

二、思想

在这里插入图片描述

三、过程

在这里插入图片描述

四、代码(交换法)

package cn.qqqking.sort;


import java.util.Arrays;


/**
* @author AnQi
* @date 2020/4/18 12 04:00
* @description
*/
public class ShellSort {
    public static void main(String[] args) {
        int arr[] = {8,9,1,7,2,3,5,4,6,0};
        shellSort(arr);


    }


    /**
     * 逐步推导
     */
    public static void shellSort(int arr[]){


        int temp = 0;
        int count =0;
        for (int gap = arr.length/2; gap > 0 ; gap /= 2) {
            count++;
        for (int i = gap; i < arr.length; i++) {
            //遍历各组中 所有的元素 一共gap组 每组个数据 步长gap
            // i =5 j = 0
            for (int j = i - gap; j >= 0; j-=gap) {
                //如果当前元素 大于 +gap 后那个  需要交换
                if(arr[j] > arr[j+gap]){
                     temp = arr[j];
                    arr[j] = arr[j+gap];
                    arr[j+gap] = temp;
                }
            }
        }
            System.out.println("第"+(count)+"轮");
        System.out.println(Arrays.toString(arr));


        }
    }
}










/**
* 逐步推导
*/
//public static void shellSort(int arr[]){
//
//    int temp = 0;
//    /**
//     * 希尔排序 第一轮
//     * 将10个数据 分成 10/2 5组
//     */
//    for (int i = 5; i < arr.length; i++) {
//        //遍历各组中 所有的元素 一共5组 每组2个数据 步长5
//        // i =5 j = 0
//        for (int j = i - 5; j >= 0; j-=5) {
//            //如果当前元素 大于 +5 后那个  需要交换
//            if(arr[j] > arr[j+5]){
//                temp = arr[j];
//                arr[j] = arr[j+5];
//                arr[j+5] = temp;
//            }
//        }
//
//    }
//    System.out.println(Arrays.toString(arr));
//
//
//
//
//}

五、代码(移位法)

/**
     * 逐步推导
     * 移位法
     */
    public static void shellSort2(int arr[]){

        for (int gap = arr.length/2; gap > 0 ; gap /= 2) {
            //从第gap个元素 逐个对其所在的组进行直接插入排序
            for (int i = gap; i < arr.length; i++) {

                   int j = i;
                   int temp1 = arr[j];
                   if(arr[j]<arr[j-gap]){
                       while( j - gap >= 0 && temp1< arr[j-gap]){
                           //移动
                           arr[j]= arr[j-gap];
                           j -= gap;
                       }
                       //找到
                       arr[j] = temp1;
                }
            }


        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值