排序逻辑
希尔排序是在插入排序的优化,插入排序当一个小的数在右边的时候,以为插入排序只能交换相邻的数据,则需要很多次交换操作才能将前面序列保持有序,故希尔排序加入交换步长,能够交换相隔很远的数据,先队列排至大致有序,极大的提高了插入排序的效率
图示
交换排序
希尔排序
初始队列
步长为2
如果是直接插入排序,则此处需要交换两次
步长为1
就是普通的插入排序了
代码示例
public static void shellSort(int[] arr){
//遍历所有步长
for(int d = arr.length/2; d>0; d/=2){
//遍历所有元素
for(int i=d;i<arr.length;i++){
for(int j=i-d;j>=d;j-=d){
if(arr[j]>arr[j+d]){
int temp = arr[j];
arr[j] = arr[j+d];
arr[j+d] = temp;
}
}
}
}
}
时间复杂度
O(nlog2n)
原文:https://www.cnblogs.com/angle-yan/p/13348059.html