希尔排序法的介绍
希尔排序是希尔在1959年提出的一种排序算法。希尔排序也是一种插入算法,它是简单插入排序经过简单的改进之后的一个更高效的版本,也称为缩小增量排序。也是内部排序。
希尔排序的思想
希尔排序是把数据按照下标的一定增量分组,对每组直接使用插入排序算法;随着增量的逐渐减少,每组包含的关键的词越来越多,当增量减少至1时,整个文件恰好被分为一组,算法便终止。
代码实现
//根据前面的分析,使用循环处理
public static void shellSort1(int[] arr){
int temp=0;
int count=0;
for(int gap=arr.length/2;gap>0;gap/=2){
for (int i=gap;i<arr.length;i++){
//遍历各组中所有的元素(同有gap组,每组有arr.length/gap个元素),步长为gap
for (int j=i-gap;j>=0;j-=gap){
//如果当前的元素大于步长后的元素,说明需要交换位置
if (arr[j] > arr[j+gap]) {
temp=arr[j];
arr[j]=arr[j+gap];
arr[j+gap]=temp;
}
}
}
System.out.println("希尔排序第"+(++count)+"轮="+Arrays.toString(arr));
}
为了提高算法的效率,可以将交换式希尔排序优化为-----》移位式希尔排序
//对交换式希尔排序进行优化-->移位法
public static void shellSort2(int[] arr){
//增量gap,并逐步的缩小增量
int count=0;
for(int gap=arr.length/2;gap>0;gap/=2){
//从第gap个元素,逐步对其所在的组进行直接插入排序
for(int i=gap;i<arr.length;i++){
int j=i;
int temp=arr[i];
if(arr[j]<arr[j-gap]){
while (j-gap>=0 && temp<arr[j-gap]){
//移动
arr[j]=arr[j-gap];
j-=gap;
}
//退出while循环时,就给temp找到插入的位置
arr[j]=temp;
}
}
System.out.println("希尔排序第"+(++count)+"轮="+Arrays.toString(arr));
}
}
时间复杂度度 O(nlogn) 空间复杂度O(1)