思路:希尔排序是插入排序的进阶版,插入排序是吧每一个待插入数跟有序数列值进行比较,希尔排序先是吧数进行分组,先在组内排序.最后合成在进行一次排序。
详细代码:
package rank;
public class HillRank { // 希尔排序 进阶的插入排序
public static void main(String[] args) {
int[] array = { 4, 2, 5, 1, 7, 3, 8 };
array = getHillRank(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + "--");
}
}
public static int[] getHillRank(int[] array) {
int classValue = array.length / 2; // 组的距离
while (classValue >= 1) {
for (int i = classValue; i < array.length; i++) {// i=classValue 保证第一个值为每组的第一个待插入值
int j = i - classValue;// 有序列组最后一个值
int temp = array[i];// 每组的第一个 待插入值
while (j >= 0 && temp < array[j]) {
array[j + classValue] = array[j];// 大的数 后移 组的大小距离
j = j - classValue; // 在和有序值组的前一位比较
}
array[j + classValue] = temp; // while结束,替换值j停止的位置+组距的值为 待插入值
}
classValue = classValue / 2;// 在次分组
}
return array;
}
}