哈嘍,我是程式設計師大鵬。
前面我們介紹了氣泡排序和選擇排序,今天我們來看一下簡單排序中的插入排序。
打過撲克的都知道,在抓牌的時候,我們不會等抓完所有的牌再用冒泡或者選擇排序再理牌。一般是拿到一張牌就放到手裡,抓到第二張牌的時候,再跟手裡面已經有的牌進行比較,插到合適的位置,然後抓第三張牌,再與手裡面的兩張牌進行比較,然後再把牌插到合適的位置。這種一邊抓牌,一邊理牌的方式,我們就稱之為直接插入排序。
插入排序是一種從序列左端開始依次對資料進行排序的演算法。在排序過程中,索引左側的資料陸續歸位,而右側留下的就是還沒有被排序的資料。
插入排序的思路就是從右側的未排序區域內取出乙個資料做為待排序資料,然後將它插入到已排序區域內合適的位置上。一直到未排序清空。
將待排序的值臨時移除並儲存在乙個臨時變數中。
將空隙左側的每乙個值一次與臨時變數比較,如果左邊的數大於臨時變數的值,則該值右移一格,如果左邊的數字更小,就不需要繼續比較,本輪操作到此結束。最終左側會有乙個位置的空隙。
將臨時移走的資料插入到當前空隙。
重複前面三步,直到所有元素均排序完畢。
public static void insertsort(int arr)
arr[position] = temp;//插入到正確的位置}}
讓我們來一行一行地分析一下**:
for (int i = 1; i < arr.length; i++) {
在上面**是外層迴圈,在i的左側是已排序資料,起始的i等於1,是預設第0個資料已經是排序資料。
int temp = arr[i];//待排序元素賦值給臨時變數
int position = i;//記錄當前比較的索引
每一輪開始的時候,position是待排序資料的索引,temp的值就是本輪待排序的資料,第一輪的待排序索引為1,第二輪是2,第三輪是3,依次類推,一直到最後一輪。
while (position > 0 && arr[position - 1] > temp) {
開始內層的迴圈,如果滿足position大於0,並且當前位置的資料與temp比較,如果大於temp資料,則進入到迴圈裡面。
arr[position] = arr[position - 1];
position--;
資料平移乙個位置,將position做為空隙。
arr[position] = temp;
將待排序的資料temp插入到空隙的位置。
下面我們應用插入排序對陣列[4,2,3,5,1]進行排序,來看每一步的操作。
第0輪這一輪其實是沒有的,我們預設就是第乙個位置的值是有序的。
第一輪將索引值為1的值2暫時移除,儲存在臨時變數temp中,此時temp為2。
第1步:比較索引0的值4與temp中的
第2步:因為4大於2,所以將4右移。
空隙移到了陣列最左端,沒有其他值可以比較了。
第3步:將temp插回到陣列中,結束第一輪。
第二輪將索引為2的值3暫時移除,儲存到臨時變數temp中,此時temp為3。
第4步:比較4與temp
第5步:因為4比3大,所以將4右移
第6步:比較2與temp
第7步:因為2比3小,所以無須2平移,平移結束
第8步:將temp插回到陣列的空隙中,結束第二輪。
第三輪將索引為3的值5暫時移除,儲存在臨時變數temp中,此時temp的值為5.
第9步:比較4與temp
第10步:因為4比5小,,所以無須4平移,平移結束
第四輪將索引為4的值1暫時移除,儲存在臨時變數temp中,此時temp的值為1.
第11步:比較5與temp
第12步:因為5比1大,所以將5右移
第13步:比較4與temp
第14步:因為4比1大,所以將4右移
第15步:比較3與temp
第16步:因為3比1大,所以將3右移
第17步:比較2與temp
第18步:因為2比1大,所以將2右移
空隙移到了陣列最左端,沒有其他值可以比較了。
第19步:將temp的值1插回到陣列的空隙中。
到現在為止,整個陣列已經排好序了。
在插入排序中,需要將取出的資料與其左邊的數字進行比較。就跟前面講的步驟一 樣,如果左邊的數字更小,就不需要繼續比較,本輪操作到此結束,自然也不需要交換 數字的位置。
然而,如果取出的數字比左邊已歸位的數字都要小,就必須不停地比較大小,交換數字,直到它到達整個序列的最左邊為止。具體來說,就是第 k 輪需要比較k-1 次。因 此,在最糟糕的情況下,第2 輪需要操作1 次,第 3 輪操作2 次……第n 輪操作n-1 次,所以時間複雜度和氣泡排序的一樣,都為 o(n^2)。
和前面講的排序演算法一樣,輸入資料按從大到小的順序排列時就是最糟糕的情況。
面試必備 經典演算法動畫解析之氣泡排序
哈嘍,我是程式設計師大鵬。最近在招聘過程中,發現好多小夥伴最基礎的一些演算法回答,接下來會做乙個系列,把基礎的排序等演算法採用動畫的形式做解析。這是第一篇氣泡排序。氣泡排序 bubble sort 是一種交換排序,基本思想是兩兩比較相鄰記錄,如果逆序則進行交換,直到沒有逆序的記錄為止。冒泡演算法有很...
面試經典演算法2之插入排序
插入排序 將待排序的資料元素與前面已經排好序的資料比較,將其插入到其中。每趟都是從待排序的資料元素開始掃瞄。典型的插入排序演算法有 1 簡單直接插入排序 2 希爾排序 簡單直接插入排序 bool insertsort int a,int n for int i 1 i 0 a j val,val插在...
經典演算法之插入排序
一 基本思路 將乙個待排序的記錄,按照關鍵字大小插入到前面已經拍好的子串行的適當位置,直到全部記錄插入完成為止。如果序列基本有序,效率很高。二 include stdafx.h include includeusing namespace std void swap int a,int b void...