插入排序和希尔排序(Java)

Posted 小鹿可可乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序和希尔排序(Java)相关的知识,希望对你有一定的参考价值。

插入排序和希尔排序

1.插入排序

1.1 排序思想

插入排序的算法是通过构建有序序列,对于未排序的数据,在已经排序中从后向前查找操作,找到满足条件的元素之后进行位置插入操作

  • 从第一个元素开始,该元素可以认为是排序好的元素
  • 取出下一个元素,在已经排序好的元素中从后向前进行查找
  • 如果已经排序好的元素大于新元素,将该元素移动到下一个位置
  • 重复上一步,直到找到已排序好的元素小于新元素,进行元素的插入动作

时间复杂度:最优O(n)平均:O(n^2)
空间复杂度:O(1)
稳定性:稳定

1.2 代码

//插入排序
    public static <T extends Comparable<T>>void insertSort(T[] arr)
        if(arr==null||arr.length==0)
            return;
        
        //先找位置
        for(int i = 0;i<arr.length-1;i++)
            int minIndex = i;
            for(int j =i+1;j<arr.length;j++)
                if(arr[j].compareTo(arr[minIndex])<0)
                    minIndex=j;
                
            
            T temp = arr[minIndex];
            //移动数据
            int z;
            for(z=minIndex;z>i;z--)
                arr[z]=arr[z-1];
            
            arr[z] = temp;
        
    

2.希尔排序

2.1排序思想

一种插入排序,它是简单插入排序的一种算法改进方式,也成为见效增量排序,希尔排序的时间复杂度相比直接插入排序的时间复杂度要小,它与直接插入不同在于,他会优先比较距离较远的元素,希尔排序是按照一定的增量进行分组排序,对每一组进行直接插入排序,随着分组个数的减小,每组中元素就会越来越多,当增量为1,排序结束

选择增量gap=length/2;缩小增量继续以gap=gap/2的方式进行分组

间隔式分组:5组、3组、1组
1.

2.

3.

平均时间复杂度:O(n^1.3 到
n^1.5)
空间复杂度:O(1)
稳定性:不稳定

2.2 代码

//希尔排序
    public static <T extends  Comparable<T>>void shellSort(T[] arr,int gap)
        int i = 0,j=0;
        for(j=gap;i<arr.length;i++)
            T temp = arr[i];
            for(j=i-gap;j>=0;j-=gap)
                if(temp.compareTo(arr[j])<0)
                    arr[j+gap] = arr[j];
                
                else
                    break;
                
            
            arr[j+gap]=temp;
        
    
    public static <T extends Comparable<T>>void shell(T[] arr)
        int[] partition=5,3,1;
        for(int i = 0;i<partition.length;i++)
            shellSort(arr,partition[i]);
        
    

今天也要好好学习呀~

以上是关于插入排序和希尔排序(Java)的主要内容,如果未能解决你的问题,请参考以下文章

插入排序和希尔排序(Java)

插入排序和希尔排序(Java)

Java语言希尔排序

排序算法入门之希尔排序(java实现)

插入排序算法之直接插入排序和希尔排序

排序系列 之 希尔排序算法 —— Java实现