文章目录
前言
希尔排序的思想是使数组中任意间隔interval的元素都是有序的,每次排序interval/2。这样每次排序完成就会完成大部分数组有序,最后一次只要调整一下顺序即可。
一、希尔排序示例
元素数组 ⑧①③④⑤②⑦⑥
第一次分组:⑧①③④⑤②⑦⑥
第一次排序:⑤①③④⑧②⑦⑥
第二次分组:⑤①③④⑧②⑦⑥
第二次排序:③①⑤②⑦④⑧⑥
第三次分组:③①⑤②⑦④⑧⑥
第三次排序:①②③④⑤⑥⑦⑧
二、Java代码实现
代码实现如下
public class ShellSort {
public static void main(String[] args){
run(5);
}
/**
* 测试示例
*/
public static void run(int num){
int[] arr = new int[num];
for(int i = 0; i < arr.length; i++){
arr[i] = (int) (Math.random() * num);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("开始时间:"+sdf.format(new Date()));
System.out.println(Arrays.toString(arr));
sortInsert(arr);
//数据小的时候,可以采用下列方法打印数据
System.out.println(Arrays.toString(arr));
System.out.println("结束时间:"+sdf.format(new Date()));
}
//升序排序
public static void sort(int[] arr){
//数组长度
int len = arr.length;
//因子
int factory = 2;
//间隔
int interval = len / factory;
while (interval >= 1){
//将数组分割为interval个数组
for(int i = interval; i < len; i++){
//每组数组下标的间隔为j = interval, 每次 j -= interval且j>=0;
for(int j = i; j >= interval && arr[j] < arr[j - interval]; j -= interval){
int tmp = arr[j];
arr[i] = arr[j - interval];
arr[j - interval] = tmp;
}
// System.out.println(Arrays.toString(arr));
}
interval = interval / factory;
}
}
public static void sortInsert(int[] arr){
//数组长度
int len = arr.length;
//因子
int factory = 2;
//间隔
int interval = len / factory;
while (interval >= 1){
//将数组分割为interval个数组
for(int i = interval; i < len; i++){
int min = arr[i];
int j = i;
while (j >= interval && min < arr[j - interval] ){
arr[j ] = arr[j - interval];
j -= interval;
}
arr[j] = min;
}
interval = interval / factory;
}
}
}