希尔排序
希尔排序是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
/**
* 希尔排序
* 希尔排序是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序
*/
public class ShellSort {
/**
* 算法描述:
* 1.首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对每一个小组分别进行插入排序,此时,插入排序所作用的数据量比较小(每一个小组),插入的效率比较高
* 2.每个分组进行插入排序后,各个分组就变成了有序的了(整体不一定有序)
* 3.然后缩小增量为上个增量的一半,继续划分分组,此时,每个分组元素个数多了,但是,数组变的部分有序了,插入排序效率同样比高
* 4.同理对每个分组进行排序(插入排序),使其每个分组各自有序
* 5.重复3~4当增量减至1时,整个数组被分为一组,此时,整个数组已经接近有序了,插入排序效率高
* @param args
*/
public static void main(String args[]) {
int[] arr = {11, 6, 2, 7, 23,7, 8, 3, 9, 12, 0,27};
int length = arr.length;
System.out.print("排序前---------------------:");
printArr(arr);
int second = 1;
//进行分组,最开始时增量(gap)为数组长度的一半
for(int gap = length/2; gap > 0;gap /= 2){
//对个分组进行插入排序
for(int i=gap;i<length;i++){
int j = i;
int current = arr[i];
while(j-gap>=0 && arr[j-gap]>current){
arr[j] = arr[j-gap];
j = j-gap;
}
arr[j] = current;
}
System.out.print("第"+second+"次分组,增量为:"+gap+"排序结果:");
printArr(arr);
}
}
/**
* 输出排序结果
* @param arr
*/
private static void printArr(int[] arr){
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+",");
}
System.out.println();
}
}
执行过程
排序前------------------------------:11,6,2,7,23,7,8,3,9,12,0,27,
第1次分组,增量为:6排序结果:8,3,2,7,0,7,11,6,9,12,23,27,
第1次分组,增量为:3排序结果:7,0,2,8,3,7,11,6,9,12,23,27,
第1次分组,增量为:1排序结果:0,2,3,6,7,7,8,9,11,12,23,27,