1.前提:基于直接插入排序算法
2.背景:直接插入排序针对于大规模乱序和倒序效率较低
3.思想: 使数组中任意间隔为H的元素都是有序的,换句话说是一个H有序数组是H个互相独立的有序数组编制成的数组
4.实现:对于每个H 用插入排序将H个子数组独立排序
//文件名 :Demo.java
import java.lang.*;
import java.util.Arrays;
import java.util.Scanner;
import java.io.*;
import java.math.*;
public class Demo{
// sort template
public static void sort(Comparable[] a){
//希尔排序 实现二
int N = a.length;
int h = 1;//h有序数组
while(h < N/3) h = h*3 + 1;//h是最小的有序数组长度 如果h小于N/3 就三倍增
while(h > 0){
for(int i = h;i < N;i++){
for(int j = i;j >= h && less(a[j],a[j-h]); j-=h){
exch(a,j,j-h);
}
};
h=h/3;//这一趟的H最小有序数组比较完成,将有序数组分割☞更小单位
}
//希尔排序 实现2 有问题 看一就好了
// int N = a.length;
// //gap 增量 H有序有序数组的大小 z增量依次减小直至1
// for(int gap = N/2; gap > 0; gap/=2){
// //从第gap 个元素开始逐个对所在组进行直接插入排序操作
// for(int i = gap;i < N; i++){
// int j = i;//这个就是复制一个 i 防止直接对i操作造成错误 影响到程序
// while(j-gap > 0 && a[j]<a[j-gap]){
// exch(a,j,j-gap);
// j=j-gap;
// }
// }
// }
show(a);
}
private static void exch(Comparable[] a,int i,int j){
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static boolean less(Comparable a,Comparable b){
return a.compareTo(b) < 0;
}
public static void show(Comparable[] a){
for(int i = 0; i < a.length; i++){
System.out.println(a[i]+" ");
}
}
public static boolean isSorted(Comparable[] a){
for(int i = 1; i < a.length; i++){
if(less(a[i],a[i-1])){
return false;
}
}
return true;
}
public static void main(String[] args) {
Comparable[] a = {3,1,5,7,9,4,6,1,34,4};
sort(a);
}
}