package sort;
import java.util.Arrays;
/**
* 希尔排序:其核心思想为将数组分为若干组,每间隔incre的元素组成一组(注意:是相隔incre,并非连续incre个),对每组进行插入排序,直至间隔减小到1排序结束
* 时间复杂度为o(n3/2)
* @author:zhaidc@qq.com
* @date:2022年2月26日 下午10:08:14
*/
public class ShellSort {
//测试方法
public static void main(String[] args) {
int[] arr = {-3,0,9,8,4,3,-4,4,3,2};
shellSort(arr);
System.out.print(Arrays.toString(arr));
}
/**
* 希尔排序
* @param arr 待排序数组
*/
private static void shellSort(int[] arr) {
//incre为间隔
int incre = arr.length;
do{
/*
* 第一次进入循环时,初始间隔incre = arr.length/3+1(间隔大小取法不固定,亦可采取其他公式)
* 后续每次循环均进行除三加一的运算,使间隔逐渐变小,当间隔为1时,执行完do内的代码后排序结束
*/
incre = incre / 3 + 1;
/*
* 进行组内插入排序
* 将第一组的第一个元素(即数组首位)当做已排序部分,从第一组的第二个元素(索引为incre)开始循环
*/
for(int j = incre;j < arr.length;j++) {
//若当前元素比本组前一个元素小,则如下
if(arr[j] < arr[j - incre]) {
//将当前元素备份为tmp
int tmp = arr[j];
int k = j - incre;
//从本组前一个元素依次向前遍历,若值比当前元素(tmp,即arr[j])小,则结束循环
for(;k >= 0 && arr[k] > tmp;k -= incre) {
//若值比当前元素(tmp)大,则k处的值后移至k + incre处,k处变为空位
arr[k + incre] = arr[k];
}
//将tmp(即arr[j])置于空位处
arr[k + incre] = tmp;
}
}
}
while(incre > 1);
}
}
希尔排序——Java实现
最新推荐文章于 2024-03-25 14:08:38 发布