数据结构学习--Java希尔排序

你说的曾经没有我的故事 提交于 2019-12-03 20:21:08

插入排序的缺陷

多次移动。假如很小的数据在靠右端的位置上,那么要将该数据排列到正确的位置上,则所有的中间数据都需要向右移动一位。

特别是如果数据量大,但是某些较小的数据排在了最后面,那么移动位置将非常消耗时间。

希尔排序的优点

通过加大插入排序中元素之间的间隔,并对这些间隔的元素进行插入排序,从而使得数据可以大幅度的移动,当完成该间隔的排序后,

希尔排序会减少数据的间隔进行排序,依次进行下去。

间隔计算

间隔h的初始值为1,通过h = 3*h + 1来计算循环,直到该间隔大于数组的大小时停止。最大值间隔为不大于数组大小的最大值。

间隔的减少

h = (h -1)/3

 

 

 

 第三趟排序使用插入排序即可。

 代码实现:

package com.example.deer;public class ShellSort {    public void sort(long[] arr){        //初始化一个间隔        int h = 1;        //计算最大间隔        while(h < arr.length / 3){            h = h * 3 + 1;        }        while (h > 0){            //进行插入排序            long tmp = 0;            for(int i = h;i < arr.length;i ++){                tmp = arr[i];                int j = i;                while (j > h - 1 && arr[j - h] >= tmp){                    arr[j] = arr[j - h];                    j -= h;                }                arr[j] = tmp;            }            //减小间隔            h = (h - 1) / 3;        }    }}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!