我去,你竟然还不会插入排序

排序算法是最常见的笔试题目,几乎所有的笔试和面试都会考到,因为它体现的就是程序员的算法基础。

插入排序

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

(每步将一个待排序的元素,按其排序码大小插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止)
在这里插入图片描述
在这里插入图片描述

具体算法描述如下:

1、将待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列;

2、取出下一个元素,在已经排序的元素序列中从后向前扫描;

3、如果该元素(已排序)大于新元素,将该元素移到下一位置;

4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

5、将新元素插入到该位置后;

6、重复步骤2~5。
在这里插入图片描述

约定

待排序的元素需要实现 Java 的 Comparable 接口,该接口有 compareTo() 方法,可以用它来判断两个元素的大小关系。

使用辅助函数 less() 和 swap() 来进行比较和交换的操作,使得代码的可读性和可移植性更好。

排序算法的成本模型是比较和交换的次数。

package 算法.排序;/*
作者     :XiangLin
创建时间 :15/05/2020 17:17
文件     :Sort.java
IDE      :IntelliJ IDEA
*/

public abstract class Sort<T extends Comparable<T>>{
    public abstract void sort(T[] nums);

    protected boolean less(T v, T w){
        return v.compareTo(w) < 0;
    }

    protected void swap(T[] a,int i ,int j){
        T t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
}

代码

package 算法.排序;/*
作者     :XiangLin
创建时间 :23/05/2020 11:51
文件     :Insertion.java
IDE      :IntelliJ IDEA
*/

public class Insertion <T extends Comparable<T>> extends Sort<T>{

    @Override
    public void sort(T[] nums) {
        int N = nums.length;
        for (int i = 1; i < N ;i++){
            for (int j = i; j > 0 && less(nums[j],nums[j-1]); j --){
                swap(nums,j,j - 1);
            }
        }
    }
    public static void main(String[] args) {
        Integer[] nums = {52,63,14,59,68,35,8,67,45,99};
        System.out.println("原数组:");
        for(int i :nums){
            System.out.print(i+" ");
        }
        System.out.println();
        Insertion s = new Insertion();
        s.sort(nums);

        System.out.println("排序后:");
        for(int i :nums){
            System.out.print(i+" ");
        }
    }
}

在这里插入图片描述

结果分析

插入排序的时间复杂度取决于数组的初始顺序,如果数组已经部分有序了,那么逆序较少,需要的交换次数也就较少,时间复杂度较低。

1.平均情况下插入排序需要 ~N2/4 比较以及 ~N2/4 次交换;

2.最坏的情况下需要 ~N2/2 比较以及 ~N2/2 次交换,最坏的情况是数组是倒序的;

3.最好的情况下需要 N-1 次比较和 0 次交换,最好的情况就是数组已经有序了。

另外博主收藏这些年来看过或者听过的一些不错的常用的上千本书籍,没准你想找的书就在这里呢,包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列(常用深度学习框架TensorFlow、pytorch、keras。NLP、机器学习,深度学习等等),大数据系列(Spark,Hadoop,Scala,kafka等),程序员必修系列(C、C++、java、数据结构、linux,设计模式、数据库等等)以下是部分截图

更多文章见本原创微信公众号「五角钱的程序员」,我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活。关注回复【电子书】即可领取哦

在这里插入图片描述

在这里插入图片描述
给大家推荐一个Github,上面非常非常多的干货:https://github.com/XiangLinPro/IT_book

To do the useful thing, to say the courageous thing, to contemplate the beautiful thing: that’s enough for one man’s life.
做有用的事,说勇敢的话,想美好的事,一生足矣。

2020.5.23于城口

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读