前言
希尔排序
-
是将大的数组切分成小的数组,切分粒度越来多大直至为1个数组。其中切分粒度(interval = len/2)开始循环interval = interval/2,直至interval为1。
-
每次切分后的数组进行排序(这里可以选择插入排序、冒泡排序)。
-
因每次切分后排序,会使数组达到在下次切分的时候是大部分有序的。减少数据比较和交互的时间。
一、希尔排序示例图
二、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;
}
}
}