希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
是插入排序的一种,只不过是效率更高。就能独立成一种算法。
对希尔算法,就是先知道这个数组的长度n,,
所以,它的一半就是n/2,如果不能整除就向上取整;
第一轮:先将数据分成两组,个数是奇数的话,向上取整。
取出来第一组的第一个数,和第二组的第一个数比较
取出来第一组的第二个数,和第二组的第二个数比较
….对应的位置比较
第一轮结束。
第二轮,根据第一轮的一半(可能向上取整了)的一半分组(第二轮不会有向上取整,肯定是偶数,1除外….);
又是第一轮的方法,取出来新的第一组的第一个数,先与第二组的第一个数比较,第一个数字大了就和第二组的第一个数互换位置。
比完了后,又将第二组的第一个数和第三组的第一个数比较。
以此类推….比到最后一个没得比了,
拿就从第一组中取出来第二个数,按照上面的方法开始往下比较…
……
……
直到>>>一半的一半的一半…等于1,就按照顺序,第一个,第二个比较看是否要换位置后,又将第二个与第三个进行比较…
比较完了就排好序了…
代码:
/**
* 希尔排序(最小增量排序)
* 基本思想:
* 算法先将要排序的一组数按某个增量 d(n/2,n为要排序数的个数)分成若干组,
* 每组中记录的下标相差 d.对每组中全部元素进行直接插入排序,
* 然后再用一个较小的增量(d/2)对它进行分组,
* 在每组中再进行直接插入排序。
* 当增量减到 1时,进行直接插入排序后,排序完成。
*/
public class Client {
public static void main(String[] args) {
int[] a = {49, 38, 65, 97, 76, 13, 27, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51};
System.out.println(Arrays.toString(a));
System.out.println("=======================");
shellSort(a);
}
/**
* 用希尔算法进行排序
*
* @param a 需要排序的数组
*/
private static void shellSort(int[] a) {
double d1 = a.length;
int temp = 0;
//开始循环
while (true) {
//ceil 则是不小于他的最小整数
//每循环一次,增量就减半向上取整
d1 = Math.ceil(d1 / 2);
int d = (int) d1;
//开始进行遍历数组分割出来的第一部分
for (int x = 0; x < d; x++) {
//
System.out.println("-------" + d + "--------");
for (int i = (x + d); i < a.length; i += d) {
int j = (i - d);
temp = a[i];
System.out.println("i==" + i);
System.out.println("temp==" + temp);
System.out.println("j==" + j);
System.out.println("a[j]==" + a[j]);
for (; j >= 0 && temp < a[j]; j -= d) {
a[j + d] = a[j];
}
a[j + d] = temp;
}
System.out.println(Arrays.toString(a));
}
//当d==1的时候跳出死循环
if (d == 1) {
break;
}
}
// System.out.println(Arrays.toString(a));
}
}
转自:http://blog.csdn.net/www_wangjun/article/details/73291502