Java教程

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

本文主要是介绍插入排序和希尔排序(Java),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

插入排序和希尔排序

  • 1.插入排序
    • 1.1 排序思想
    • 1.2 代码
  • 2.希尔排序
    • 2.1排序思想
    • 2.2 代码

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)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!