希尔排序

220 阅读1分钟

希尔排序

希尔排序是是插入排序的一种,又称缩小增量排序。是插入排序的改进版本。是一种非稳定算法,由于提出这个算法的名字里含有shell故称希尔排序。

前言

  • 观看本文之前最好了解插入排序,可以参考插入排序
  • 排序流程
    • 先取一个小于数组长度的整数n作为一个增量m,然后让整个数组分组,所有m的倍数的元素放在一个分组里,然后对各组进行插入排序。然后不断的缩小增量进行继续分组排序。知道m=1为止。

代码

public static void shellSort(int arr[]){
        int gap=arr.length;
        while (true){
            gap=gap/2;
            for(int i=0;i<=gap;i++){
				//插入排序
                for(int j=i+gap;j>=0 && j-gap>=0;j-=gap){
                    if(arr[j]<arr[j-gap]){
                        int temp=arr[j];
                        arr[j]=arr[j-gap];
                        arr[j-gap]=temp;
                    }
                }
            }
            if(gap==1){
                break;
            }
        }
    }

复杂度分析

步长序列的不同,会导致最坏的时间复杂度情况的不同。 平均NlogN最坏O(n2)

插入排序和希尔排序比较

  • 直接插入排序是稳定的;而希尔排序是不稳定的。
  • 直接插入排序更适合于原始记录基本有序的集合。
  • 希尔排序的比较次数和移动次数都要比直接插入排序少,当N越大时,效果越明显。
  • 直接插入排序也适用于链式存储结构;希尔排序不适用于链式结构。

更多推荐

快速排序详解

冒泡排序详解

选择排序详解

插入排序详解

归并排序详解

堆排序详解