数据结构学习--Java希尔排序
2019-11-06 17:33 小花儿鹿 阅读(127) 评论(0) 编辑 收藏 举报插入排序的缺陷
多次移动。假如很小的数据在靠右端的位置上,那么要将该数据排列到正确的位置上,则所有的中间数据都需要向右移动一位。
特别是如果数据量大,但是某些较小的数据排在了最后面,那么移动位置将非常消耗时间。
希尔排序的优点
通过加大插入排序中元素之间的间隔,并对这些间隔的元素进行插入排序,从而使得数据可以大幅度的移动,当完成该间隔的排序后,
希尔排序会减少数据的间隔进行排序,依次进行下去。
间隔计算
间隔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;
}
}
}