排序算法是最常見的筆試題目,幾乎所有的筆試和麪試都會考到,因爲它體現的就是程序員的算法基礎。
插入排序
插入排序(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於城口