希尔排序
前言
提示:了解希尔排序前必须先理解插入排序的原理,希尔排序是一种以插入排序为基础的排序,相当于插入排序的plus版本 。
插入排序:从第二个元素开始,和前面的元素依次进行比较,如果小于前面的元素则将前面的元素移到后面,直到碰见比它小的,最后将目标元素放到比它小的元素的前一个元素。
提示:希尔排序内部不要理解为交换元素(注意理解原理),而是插入排序,将目标元素放到合适是位置上!
一、希尔排序原理
第一次排序,步长为arr.length/2,将元素以步长进行分组,对这些组内元素进行插入排序(不是一个组的不管!!!)
第二次排序,步长为arr.length/2/2,再将元素以步长进行分组,对这些组内元素进行插入排序
…
最后一次排序,步长为1,相当于一次插入排序(由于前面的操作,大大减少了这次插入排序工作量)
二、代码演示
1.方法
注意看 j 的变换
public static void sheel(int [] arr){
int gap=arr.length/2;//起始步长为arr.length/2,
int j ;
while(gap>0){
for(int i=gap;i<arr.length;i++){//插入排序代码调整
int value=arr[i];
for( j=i-gap;j>=0;j=j-gap) {
//从插入位置先前,遇见比value大的,就依次将前面的向后移动,否则结束循环
if (value < arr[j])
arr[j + gap] = arr[j];
else break;
}
arr[j + gap] = value;//将value放到合适的位置
}
gap=gap/2;//每一次大循环步长整除2
}
}
2.测试
public static void main(String[] args) {
//测试代码
int arr[]={2,4,2,43,22,55};
sheel(arr);//希尔排序
for(int p:arr)
System.out.println(p);
}