java算法 -- 希尔排序
基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列
中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
- 操作方法:
选择一个增量序列 t1,t2,…,tk,其中 ti>tj,tk=1; - 按增量序列个数 k,对序列进行 k 趟排序;
- 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进
行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长
度。
public class HillSortTest {
public static void main(String[] args) {
int[] array = {1, 2, 5, 41, 7, 11, 13, 17, 59, 19, 23, 29, 31, 37, 43, 47, 53};
int[] hillSortArrays = hillSort(array);
for (int s : hillSortArrays) {
System.out.print(s + " ");
}
}
/**
* 希尔排序
*
* @param arrays 要排序的数组
* @return 排序后的数组
*/
private static int[] hillSort(int[] arrays) {
int temp;
//默认步长为数组长度除以2
int step = arrays.length;
do {
//每次的step都是前一次的一半
step = step / 2;
//确定分组数
for (int i = 0; i < step; i++) {
//对分组数据进行直接插入排序
for (int j = i + step; j < arrays.length; j = j + step) {
temp = arrays[j];
int k;
for (k = j - step; k >= 0; k = k - step) {
//step 步数前后数据对比并交换
if (arrays[k] > temp) {
arrays[k + step] = arrays[k];
} else {
break;
}
}
arrays[k + step] = temp;
}
}
} while (step != 1);
return arrays;
}
}