我想希尔排序 应该算 插入排序的一个优化。把一个数组按规则分割成若干个子序列,
然后没子序列进行直接插入排序。然后缩小增量,对之前有过一次排序的数组,再分割,再进行插入排序,最后增量为1,数组基本有序了,执行最后一次 直接插入排序。
下边是我从其他人的博客抄的一段话,希望对大家理解起来有所帮助。
希尔排序的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
下边是我做的测试类,一个数组是 49, 38, 65, 97, 26, 13, 27, 49, 55, 4,11。
第一趟按照 增量为5 进行分割子序列(5组),每组的下标是0 5 10; 1 6 ; 2 7 ; 3 8 ;4 9
然后对每组进行直接插入排序。
第二趟按照 增量为2,分割成两组 。
第三趟按照增量为1 ,也就是只分割成了1组 ,直接插入排序。
import java.util.Arrays; public class Array { // 把11个数的数组,分成三组 static void group(){ //0 5 10; 1 6 ; 2 7 ; 3 8 ;4 9 int [] ia = {49, 38, 65, 97, 26, 13, 27, 49, 55, 4,11}; // 把数组分成三组 int gap = ia.length/2; int count = 0; while(count<gap){ int i = count; while(i<ia.length){ System.out.println(ia[i]); i = i+gap; } count++; } } // 希尔排序 static void shellSort(){ int [] ia = {49, 38, 65, 97, 26, 13, 27, 49, 55, 4,11}; System.out.println("原始数据:"+ Arrays.toString(ia)); // 把数组分成三组 int gap = ia.length/2; // 0 5 10; 1 6 ; 2 7 ; 3 8 ;4 9 int count = 0; while (gap>=1) { while(count<gap) { int original = count+gap; // 表示从每组的哪个下标开始进行插入排序 ,即从每组第二个下标开始的 5,6,7,8,8,9开始进行插入排序 while(original<ia.length) { int current = original; // current 当前要 进行插入排序的元素的下标 int previous = original-gap; while(previous>=0 && (ia[previous]>ia[current])) { // if() { int temp ; temp = ia[previous]; ia[previous] = ia[current] ; ia[current] = temp; current = current-gap; previous = previous-gap; // } } original = original+gap; } //original<ia.length while end count++; } System.out.println(Arrays.toString(ia)); //打印每趟循环后的元素变化 gap = gap/2; count = 0; } System.out.println("排好序的数据"+Arrays.toString(ia)); } /** * @param args */ public static void main(String[] args) { shellSort(); }