排序算法——希尔排序

  • 排序逻辑

    希尔排序是在插入排序的优化,插入排序当一个小的数在右边的时候,以为插入排序只能交换相邻的数据,则需要很多次交换操作才能将前面序列保持有序,故希尔排序加入交换步长,能够交换相隔很远的数据,先队列排至大致有序,极大的提高了插入排序的效率

    图示

    • 交换排序

    • 希尔排序

    • 初始队列

    • 步长为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)

原文地址:https://www.cnblogs.com/angle-yan/p/13348059.html