希尔排序是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。
排序原理:
1、选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组。
2、对分好组的每一组数据完成插入排序。
3、减小增长量,最小减为1,重复第二步操作。
-- 原理图:
-- API设计:
-- 代码:
/**
* 希尔排序
*/
public class Shell {
/**
* 排序接口
* @param a
*/
public static void sort(Comparable[] a) {
// 确定增长量
int N = a.length;
int h = 1;
while(h < N) {
h = 2*h+1;
}
// 当增长量小于1,排序结束
while(h >= 1) {
// 按增长量进行插入排序
for(int i = h;i < N;i++) { // 遍历未排序元素
for(int j = i;j >= h;j -= h) { // 遍历已排序元素
if(greater(a[j-h],a[j])) { // 如果已排序的元素大于未排序的元素,交换位置
exch(a,j-h,j);
}else {
// 找到一个元素小于等于未排序元素跳出循环
break;
}
}
}
h /= 2; // 缩小增长量
}
}
/**
* 元素v是否大于元素w
* @param v
* @param w
* @return
*/
private static boolean greater(Comparable v,Comparable w) {
return v.compareTo(w) > 0;
}
/**
* 交换i和j位置的元素
* @param a
* @param i
* @param j
*/
private static void exch(Comparable[] a,int i,int j) {
Comparable temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
-- 测试代码:
public class ShellTest {
public static void main(String[] args) {
Integer[] a = {9,1,2,5,7,4,8,6,3,5} ;
Shell.sort(a);
System.out.println(Arrays.toString(a));
}
}
-- 运行效果图:
@ 以上内容属于个人笔记