Java數據結構與算法——插入排序

聲明:碼字不易,轉載請註明出處,歡迎文章下方討論交流。

前言:Java數據結構與算法專題會不定時更新,歡迎各位讀者監督。本篇文章介紹排序算法中插入排序算法,包括插入排序的思路,適用場景,性能分析,java代碼等java

0、其餘排序算法索引(待更)

java數據結構與算法——快速排序
java數據結構與算法——桶排序算法

一、插入排序的思想及原理

插入排序通常分爲直接插入排序二分插入排序,本文只介紹直接插入排序,二者的區別僅在於插入的方式不同。segmentfault

插入排序是在待排序數組裏插入數據。通常咱們認爲插入排序就是往一個已經排好序的數列中插入一個元素,使得插入這個數之後,數組仍然有序。數組

下面具體介紹下插入排序的思路:數據結構

  • 首先須要明確待排序的數組由兩部分組成,一部分是已經排好序的部分,另外一部分是待排序的部分。
  • 接着咱們每次選取待排序部分的第一個元素,分別與前面排好序的元素進行比較。當大於前面元素時,能夠將該元素直接進入已排好序的部分; 當小於前面元素時,須要把這個元素拿出來暫存,將前面的元素後移,繼續與前面的元素相比,直到比較到數組第一個元素或者出現第一個小於拿出的這個元素,這時中止比較、移動,直接把這個元素放到當前空位上。
  • 一直重複步驟2,直到待排元素已經沒有元素可進行插入時,中止操做,當前數列爲已排好序的數列。

二、插入排序java代碼實現

首先最外層一定有個大循環,用於待排序部分的數列。還須要一個內層循環,分別與前面排好序的部分進行比較和移動,直到找到位置能夠進行插入。參照撲克牌摸牌後排序性能

public class InsertSort {
    private int[] array;
    public InsertSort(int[] array){
        this.array = array;
    }
    
    public void insertSort(){
        if(array==null){
            throw new RuntimeException("沒有待排數組");
        }
        int length = array.length;
        if(length>0){
            for(int i=1;i<length;i++){
                int temp = array[i]; //記錄未排好序的第一個元素爲temp
                int j = i;   
                
                for(;j>0&&array[j-1]>temp;j--){  //原理中的步驟2
                    array[j] = array[j-1];   //移位
                }
                array[j] = temp;   //插入
            }
        }
    }
    
    public void print(){  //用於打印排完序後的數組
        for(int i=0;i<array.length;i++){
            System.out.println(array[i]);
        }
    }
}

測試程序測試

public class SortTest {
    public static void main(String[] args) {
        insertSortTest();
    }

    private static void insertSortTest(){
        int[] array = {3,5,0,7,1,4,6};
        InsertSort is = new InsertSort(array);
        is.insertSort();
        is.print();
    }
}

三、插入排序的特色及性能

插入排序和玩撲克牌摸牌後在手中排序同樣的原理,比較容易理解。插入排序在序列近似有序時,效率比較高,由於此時減小了比較和移動的次數。this

從原理和代碼來看,插入排序的時間複雜度尾O(n^2),外層循環執行n次,內層在最壞的狀況下也執行n次,而且除了比較操做還有移動操做。最好的狀況是序列近似有序,這時內層循環只需比較及移動較少個元素便可完成。當序列自己有序時,插入排序的時間複雜度爲O(n)。所以,在數列越有序,效率越高。code

空間複雜度爲O(1),是常量級的。由於只用了一個變量暫存每次未排好序的首個元素。排序

插入排序是穩定的排序算法,由於是在相對排好序的基礎上進行比較和移動,因此能夠保持相對順序不變,因此是穩定的排序算法。

四、插入排序的適用場景

插入排序的特色是在近似有序的狀況下效率比較高。但由於其時間複雜度爲O(n^2),因此一般並不單獨適用。在全部的排序算法中,咱們優先使用快速排序。快速排序在分區規模達到必定的值時(好比10左右),咱們改用插入排序算法排該分區。由於此時的分區內數據每每是近似有序的,因此使用快排並不必定優於插入排序。在不少高級語言在內部對快速排序的實現中,也是在分區達到必定規模改用插入排序來排該分區。

其餘排序算法索引(待更)
java數據結構與算法——快速排序
java數據結構與算法——桶排序

碼字不易,如對您有幫助,歡迎點贊收藏打賞^_^

相關文章
相關標籤/搜索