插入排序應該算是比較好理解的一種了,原理類似於我們打牌的時候,摸牌插入手中的情景。來看一下圖,立刻就明白了:
我們將乙個陣列int a[12] 看做一副撲克牌,假設陣列有12個數,那麼撲克牌也一共有十二張,放在一起開始;
我們先抽一張拿到手上,這時候,我們不需要排序,因為不論哪一張先被我們抽上來,不論大小都只有一張,我們不妨將這張牌定為a[0]
然後我們再抽一張(a[1]),假設我們打牌的習慣是牌抽上來的牌從小到大排列,左邊的牌最小,右邊的牌最大(即陣列從小到大排序),那我們我們抽上來的第二張牌,先要跟抽上來的第一張牌(已經拿在手上的這張)進行大小比較,如果小於第一張牌(a[0]),那麼就應該放在a[0]的左邊;如果大於第一張牌(a[0]),那麼就應該放在a[0]右邊;如果兩張牌相等,怎麼放都行。
然後我們再抽第三張牌(a[2]),這時我們就需要遍歷一下手上已經拿到且排好序的兩張牌,看看有沒有一張牌比a[2]大,如果有,a[2]就要插入到這個比它大的位置,如果沒有,那麼a[2]就放在最右邊即可;如果要插入,在插入之前,要把後面的牌依次先往後移動一位,給a[2]騰出乙個位子,這樣a[2]再插入其中。
之後每摸一張牌,都需要進行一次這樣的遍歷,將摸到的新牌插入到最合適的位置,直到最後一張牌插入完畢,手上的牌也就按從小到大的順序排列好了,相應的我們的陣列也就已經排序完畢。
按照這樣的思想,我們能比較容易的寫出插入排序的**:
#include //陣列長度
#define max_size 12
//陣列最大下標
#define max_index max_size-1
typedef int t;
using namespace std;
//申明插入排序函式
void insertsort(t* a);
//申明列印陣列的函式
void printarr(t a);
int main() ;
printarr(a);
insertsort(a);
printarr(a);
return 0;}/*
* 列印陣列函式
*/void printarr(t a)
cout << endl;}/*
* 插入排序函式
*/void insertsort(t* a)
} //拿到的這個a[j],是序列裡面第乙個大於a[i]的數,也可能不存在,那麼這時j應該==i
if (j < i)
//真正將a[i]的原值插入j位置
a[j] = tmp;
} }}
演算法導論 插入排序
introduction to algorithms second edition chapter2,insertion sort date 2014 9 14 include include include define max 50 typedef struct sortarr 直接插入排序 i...
演算法導論 插入排序
對於只有乙個元素的陣列,本身為已序。對於兩個元素的a,認為 a0 為已序,a1為key 若key a0 則將key 放到a0後。若不是,後移a0 對於多個元素的陣列 考慮將key 插入到已序的 a0 aj a0 a1 a2.中,可以將key 與aj a0 逐個比較,並後移,直到遇到乙個比key 小的...
演算法導論 插入排序
演算法導論 插入排序 標籤 空格分隔 演算法導論 什麼是排序?考慮對於給定輸入的某乙個陣列 a a a 經過排序演算法,我們可以得到原始排列的乙個序列a a a 2 a n a 其中ai 1 a i a ai 1 什麼是插入排序?對於陣列a 0 a 1 a n 1 取0 i n0 le i n 0 ...