1. 基本概念
基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d,
对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序,
当增量减到1时,进行直接插入排序后,排序完成。
2. 算法分析
1、将包含n个元素的数组,分成n/2个数组序列,第一个数据和第n/2+1个数据为一对...
2、对每对数据进行比较和交换,排好顺序;
3、然后分成n/4个数组序列,再次排序;
4、不断重复以上过程,随着序列减少并直至为1,排序完成。
3. 代码实现
public int[] sellSort(int[] arr){
int temp;
int k = 0;
int flag;
for (int increment = arr.length / 2; increment > 0 ; increment /=2) {
System.out.println("第"+(++k)+"次排序前");
System.out.println("increment :" + increment );
for (int i = increment; i < arr.length; i++) {
temp = arr[i];
flag = i;
for (int j = i - increment; j>=0; j-=increment) {
if(temp < arr[j]){
System.out.println("temp: "+temp+" arr[j]: "+arr[j]+"; j: "+j+" ");
arr[j+increment] = arr[j];
flag = j;
}else{
break;
}
printArr(arr);
}
System.out.println("flag: "+flag);
arr[flag] = temp;
printArr(arr);
}
System.out.println("第"+k+"次排序后");
printArr(arr);
System.out.println();
}
return arr;
}
4. 测试
@Test
public void test(){
int arr[] = {6,3,8,2,9,1};
System.out.println("排序前");
printArr(arr);
int[] data = sellSort(arr);
System.out.println("排序后");
printArr(data);
}
public void printArr(int[] arr){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
5. 总结
希尔排序的关键并不是随便分组后各自排序,而是将相隔某个“增量”的记录组成一个子序列,实现跳跃式移动,
使得排序的效率提高。需要注意的是,增量序列的最后一个增量值必须等于1才行。另外,由于记录是跳跃式的移动,
希尔排序并不是一种稳定的排序算法。