介绍
希尔排序是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。其平均时间复杂度突破了O(n^2),为O(nlogn)。
插入排序一般来说是低效的,希尔排序解决了插入排序每次只能将数据移动一位的情况,可以把较小的数据快速移动到其正确的位置。
希尔排序以一定增量对序列进行分组,分组排序后,增量减半,再次进行排序,直至增量为1,排序完成。
图解如下
交换法实现
交换法是把分组中元素与相邻元素相比较,并进行交换。
public class ShellSort {
public static void shellSort(int [] arr) {
//交换法
int temp=0;
int k=0;
//把数据分组,每次分组的步长减少
for(int order=arr.length/2;order>0;order/=2) {
//order为增量
//从分组的最后一个开始往前比较
for(int i=order;i<arr.length;i++) {
//把分组排好序
for(int j=i-order;j>=0;j-=order) {
if(arr[j]>arr[j+order]) {
temp=arr[j];
arr[j]=arr[j+order];
arr[j+order]=temp;
}
}
}
System.out.println("第"+(++k)+"轮排序结果:"+Arrays.toString(arr));
}
public static void main(String[] args) {
int [] arr= {8,9,1,7,2,3,5,4,6,0};
//对于后面又较小数据的排序有较高效率
shellSort(arr);
}
}
实现结果
移动法实现
移动法为在分组中排序为插入法,从分组的最后一个寻找到正确的位置后,进行交换。移动法比交换法的效率是更高的,减少了数据的交换次数。
public class ShellSort {
//优化,移位法
public static void shell2Sort(int [] arr) {
//交换法
int temp=0;
int k=0;
//把数据分组,每次分组的步长减少
for(int order=arr.length/2;order>0;order/=2) {
//从分组的最后一个开始往前比较
for(int i=order;i<arr.length;i++) {
//把分组排好序
int j=i;
temp=arr[j];
if(temp<arr[j-order]) { //如果比步长前一个小
while(j-order>=0&&temp<arr[j-order]) { //往前找插入的位置
arr[j]=arr[j-order];
j=j-order;
}
}
arr[j]=temp;
}
System.out.println("第"+(++k)+"轮排序结果:"+Arrays.toString(arr));
}
}
public static void main(String[] args) {
int [] arr= {8,9,1,7,2,3,5,4,6,0};
//对于后面又较小数据的排序有较高效率
shell2Sort(arr);
}
}
实现结果