JAVA-希尔排序-Knuth序列以及对数器
-改进的插入排序(间隔大时移动的次数少,间隔小时移动的距离短–所以加快了效率)
public static void main(String[] args) {
int[] arr = {5,8,9,1,7,4,3,6,2};
sort(arr);
print(arr);
check();
}
static void sort(int[] arr) {
//希尔排序
int h = 1;
while(h<arr.length/3) {
h = h*3+1;//kunth序列
}
for(int gap = h;gap>0;gap = (gap-1)/3) {
for(int i =gap;i<arr.length;i++) {
for(int j =i;j>gap-1;j-=gap) {
if(arr[j]<arr[j-gap]) {
swap(arr,j,j-gap);
}
}
}
}
}
static void swap(int[] arr,int i ,int j) {
//换位
int temp = arr[i];
arr[i]= arr[j];
arr[j] = temp;
}
static void print(int[] arr) {
//打印数组
for(int i = 0;i<arr.length;i++) {
System.out.print(arr[i] + " ");
}
}
static int[] generateRandom() {
//产生随机数组
Random r = new Random();
int[] arr = new int[100];
for(int i=0;i<arr.length;i++) {
arr[i] = r.nextInt(100);
}
return arr;
}
static void check() {
//对数器
int[] arr1 = generateRandom();
int[] arr2 =new int[arr1.length];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
Arrays.sort(arr1);
sort(arr2);
boolean same = true;
for(int i = 0;i<arr1.length;i++) {
if(arr1[i]!=arr2[i]) {
same = false;
}
}
System.out.println(same);
}