排序算法是最常见的笔试题目,几乎所有的笔试和面试都会考到,因为它体现的就是程序员的算法基础。
插入排序
插入排序(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,设计模式、数据库等等)以下是部分截图
更多文章见本原创微信公众号「五角钱的程序员」,我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活。关注回复【电子书】即可领取哦。
所有巧合的是要么是上天注定要么是一个人偷偷的在努力。
有收获?希望老铁们来个三连击,给更多的人看到这篇文章
1、给俺点个赞呗,可以让更多的人看到这篇文章,谢谢各位亲。
2、亲们,关注我的原创微信公众号「五角钱的程序员」,我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活。关注回复【电子书】有很多资源哦。
给大家推荐一个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于城口