算法——插入排序

73 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,[点击查看活动详情]

插入排序

insertionSort

工作原理

通过构造有序序列,对未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

特点

时间复杂度:O(n^2)
空间复杂度:S(1)
是稳定的。

代码

public class InsertionSort{
    public static void main(String[] args){
        int[] arr={9,1,8,2,7,3,6,4,5};
        insertionSort(arr);
        insertionSortUpper(arr);
        System.out.println(Arrayds.toString(arr));
    }
    
    private static void insertionSortUpper(int[] arr){
        int e=0;
        int j=0;
        for(int i =1;i<arr.length;i++){
            e=arr[i];
            for( j=i;j>0 && arr[j-1]>e;j--){
                arr[j]=arr[j-1];
            }
            arr[j]=e;
        }
    }
    
    //优化
    private static void insertionSort(int[] arr){
        for(int i =1;i<arr.length;i++){
            for(int j=i;j>0 && arr[j-1]>arr[j];j--){
                swap(arr,j,j-1);
            }
        }
    }
    
    private static void swap(int[] arr,int i,int j){
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
}

冒泡,选择,插入,虽然都是O(n^2)级别,但是插入更快一些。
数据的分布情况:
1,完全随机——Random random = new Random();int[] arr=new int[10000];arr[i]=random.nextInt(10000);return arr;
2,大致有序——arr[i]=i+random.nextInt(10);
3,方差小——arr[i]=100+random.nextInt(10);
public static int[] getSorted(){}

getTotalRandom();//获取完全随机的数组。不同对象。int[] arr1=getTotalRandom();
Arrays.copyOf(arr1,arr1.length);//复制
System.currentTimeMillis()//获取时间

希尔排序

shellsort
第一个突破O(n^2)的排序算法。
是插入排序的改进版,不同的是,他会优先比较距离较远的元素。
缩小增量排序。gap.

特点

时间复杂度:O(n^1.3)
空间复杂度:S(1)
是不稳定的。

代码

public class ShellSort{
    public static void main(String[] args){
        int[] arr={9,1,8,2,7,3,6,4,5};
        shellSort(arr);
        System.out.println(Arrayds.toString(arr));
    }
    private static void shellSort(int[] arr){
        for(int gap=arr.length/2;gep>0;gap=gap/2){
            for(int i=gap;i<arr.length;i++){
                int j=i;
                int e=arr[i];
                while(j-gap>=0 && arr[j-gap]>e){
                    arr[j]=arr[j-gap];
                    j=j-gap;
                }
                arr[j]=e;
            }
        }
    }
}

大致排序使用插入排序会比希尔排序快。因为前面的都已经排好了,该点的左边一切都比他小。希尔基本都要走一遍。方差小,完全随机,希尔更快些。