-
排序逻辑
希尔排序是在插入排序的优化,插入排序当一个小的数在右边的时候,以为插入排序只能交换相邻的数据,则需要很多次交换操作才能将前面序列保持有序,故希尔排序加入交换步长,能够交换相隔很远的数据,先队列排至大致有序,极大的提高了插入排序的效率
图示
-
交换排序
-
希尔排序
-
初始队列
-
步长为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(nlogn)