Java八大排序算法之"希尔排序(最小增量排序)"算法

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
———————-本段来自百度百科

是插入排序的一种,只不过是效率更高.就能独立成一种算法….作为小菜鸟的我来说:

先给自己定个小目标,比如说写一个属于自己的算法.

拉倒吧,但是我倒是想到了一个把妹的纸牌游戏.
就是用13张不同的牌,其实不管多少张,只要不同数字就ok,然后,和前面的妹子互动排序.你每次拿起来两张牌只需要问谁大谁小,然后就可以用希尔算法排序了.
慎重的说一下,因为会互动很多次才能排序出来,要么少选几张牌(太少了就没有技术含量了),要么,别玩了,你们还有重要的故事要继续—>>>>康忙北鼻…

等我找个毛巾捂脸(✿◡‿◡)

对希尔算法,就是
先知道这个数组的长度n,
所以,它的一半就是n/2,如果不能整除就向上取整;
第一轮:先将数据分成两组,个数是奇数的话,向上取整.
取出来第一组的第一个数,和第二组的第一个数比较
取出来第一组的第二个数,和第二组的第二个数比较
….对应的位置比较
第一轮结束.

第二轮,根据第一轮的一半(可能向上取整了)的一半分组(第二轮不会有向上取整,肯定是偶数,1除外….);
又是第一轮的方法,取出来新的第一组的第一个数,先与第二组的第一个数比较,第一个数字大了就和第二组的第一个数互换位置.
比完了后,又将第二组的第一个数和第三组的第一个数比较.
以此类推….比到最后一个没得比了,
拿就从第一组中取出来第二个数,按照上面的方法开始往下比较…
……
……
直到>>>一半的一半的一半…等于1,就按照顺序,第一个,第二个比较看是否要换位置后,又将第二个与第三个进行比较…
比较完了就拍好序了…

这里写图片描述

妹子说,这个游戏好无聊,我不玩了.
分手 >>> /(ㄒoㄒ)/~~
程序员,活该你单身.哈哈哈

看到这么多,你肯定会蒙圈的,自己找几张扑克牌模拟一下吧.
如果是在公司的话,那就多输出一下日志就好了,我就是这么干的….哈哈哈

package com.wangjun.sort;

import java.util.Arrays;

/**
 * 希尔排序(最小增量排序)
 * 基本思想:
 * 算法先将要排序的一组数按某个增量 d(n/2,n为要排序数的个数)分成若干组,
 * 每组中记录的下标相差 d.对每组中全部元素进行直接插入排序,
 * 然后再用一个较小的增量(d/2)对它进行分组,
 * 在每组中再进行直接插入排序。
 * 当增量减到 1时,进行直接插入排序后,排序完成。
 * 
 * @author 王俊
 *
 */
public class ShellSort {

    public static void main(String[] args) {
        int[] a={49,38,65,95,25,53,51}; 
        System.out.println(Arrays.toString(a));
        System.out.println("=======================");
        sort(a);
    }
    /**
     * 用希尔算法进行排序
     * @param a 需要排序的数组
     */
    private static void sort(int[] a) {
        double d1=a.length;
        int temp=0;

        //开始循环
        while(true){
            //ceil 则是不小于他的最小整数 
            //每循环一次,增量就减半向上取整
            d1=Math.ceil(d1/2);
            int d=(int)d1;
            //开始进行遍历数组分割出来的第一部分
            for(int x=0;x<d;x++){
                //
                System.out.println("-------"+d+"--------");
                for(int i=(x+d);i<a.length;i+=d){
                    int j=(i-d);
                    temp=a[i];
                    System.out.println("i=="+i);
                    System.out.println("temp=="+temp);
                    System.out.println("j=="+j);
                    System.out.println("a[j]=="+a[j]);
                    for(;j>=0 && temp<a[j];j-=d){
                        a[j+d]=a[j];

                    }
                    a[j+d]=temp;
                }
                System.out.println(Arrays.toString(a));
            }
            //当d==1的时候跳出死循环
            if(d==1){
                break;
            }
        }

        //System.out.println(Arrays.toString(a));
    }

}

学会一种算法,我会装逼到底.
老铁,你等着.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值