排序之希尔排序
程序员文章站
2024-03-16 11:59:16
...
思路:
简单理解:分组+排序
如果想细节理解,看图
主要就是分组,然后两边组中的数据更换.然后再次分组,再次更换,直到分成最小的组.
代码:
@Test
public void sort() throws Exception {
// 数据准备
int[] data = { 12, 10, 2, 4, 5, 9, 13, 10, 8, 1, 4, 5, 3, 8, 11 };
int d = data.length;
while (d != 0) {
// 分组
d = d / 2;
for (int i = 0; i < d; i++) {
for (int j = i + d; j < data.length; j += d) {
// 获得第二组的第j个的数
int temp = data[j];
// 获得第一组的第k个的一个指针
int k = j - d;
while (k >= 0 && temp < data[k]) {
// 第二组的第k+d也就是第j个被赋值
data[k + d] = data[k];
k -= d;
}
//将第一组的第k-d个也就是第i个赋值
data[k+d] = temp;
}
}
}
for(int i : data){
System.out.print(i+"\t");
}
}
解析:
代码中最外层的while()来进行分组,里边的两个for进行分组获得数据.最里边的一个while()进行数值的交换
交换代码时,用到的交换语句也是三句
int temp = data[j]; 将值保存到一个临时变量中
data[k+d] = data[k]; 赋值
data[k+d] = temp; 赋值
这里的数值交换跟我在直接插入排序中写的是一个意思.只是在直接插入排序中k是+1,而这里是+d,即组的长度