插入排序算法是一個對少許元素進行排序的有效算法。插入排序的工做原理與打牌時整理手中的牌的作法相似,開始摸牌時,咱們的左手是空的,接着一次從桌上摸起一張牌,並將它插入到左手的正確位置。爲了找到這張牌的正確位置,要將它與手中已有的牌從右到左進行比較,不管何時手中的牌都是排序好的。算法
JAVA實現該算法以下:數組
1 public void insertSort(int a[]){ 2 int length=a.length; //數組長度 3 int j; //當前值的位置 4 int i; //指向j前的位置 5 int key; //當前要進行插入排序的值 6 //從數組的第二個位置開始遍歷值 7 for(j=1;j<length;j++){ 8 key=a[j]; 9 i=j-1; 10 //a[i]比當前值大時,a[i]後移一位,空出i的位置,好讓下一次循環的值後移 11 while(i>=0 && a[i]>key){ 12 a[i+1]=a[i]; //將a[i]值後移 13 i--; //i前移 14 }//跳出循環(找到要插入的中間位置或已遍歷到0下標) 15 a[i+1]=key; //將當前值插入 16 } 17 }
insertSort在數組A={5,2,4,6,1,3}上的處理過程,數組的下標出如今巨型的上方,黑色框的值即爲key=a[j]。spa
a[i]即爲a[j]左邊的值,每次循環key與a[i]進行比較,若是key<a[i],則a[i]移到 i+1處,同時i--向左移動,直到找到a[i]<=key或者i<0,此時將 key插入到a[i+1]處。code
問題1:a[i]第一次進行右移時覆蓋了a[i+1]值,是否形成了數據丟失?blog
答:不會形成數據丟失,應爲第一次右移前的i+1=j,此時a[j]的值存在了key裏了。每次右移都爲下一次右移或插入留出了位置,這就是插入排序的關鍵點所在。排序