插入排序的原理
我們在打撲克的時候,有沒有在拿到牌後都重新整理一遍,方便自己打牌和出牌?我想會有吧。那麼你們整理牌的方式是什麼樣的呢?我想應該都是把大的牌一張一張的往左邊挪,直到所有的牌都從大到小排列吧。是的不管你們是不是這樣,反正我的是這樣~~。那麼,你們比較大小的方式是什麼呢?有人可能就說:那肯定是看牌在哪兩個數字之間,直接插入進去,如果是最大的,就放左邊啊。如果是這樣,恭喜你,初步掌握了插入排序的基礎。爲什麼是初步,而又是基礎呢?這是因爲你這還不是插入排序的思路,只是接近了而已。那麼,什麼纔是插入排序的思路呢?別急,好戲後頭,我們一起來揭曉吧!
好,插入排序法的整牌方式還有1分鐘到達戰場。
你已獲得一副好牌,請從小到大進行整理(就喜歡不按常理整牌):
首先,把整理牌的過程看作一個循環,你有n張牌,就循環n-1遍。起步是第1張牌,終點是第n-1張牌
其次,假設你目前第n張牌,那麼以第n張牌爲範圍,再進行一次循環。起點是n,終點是0
然後,我們以第n張牌進行比較,如果arr[1]小於arr[0],那麼我們交換兩者,然後從n-1起步,與n-2進行比較。直到arr[n-1]大於 arr[n-2],則推出循環,此時已經成排序
最後,沒了~
看不懂,不怕,帶着描述看代碼最容易讓人懂了
插入排序思路的實現
void insertSort(int[] arr){
int length =arr.length;
int nextIndex;
int compareIndex;
if(length>1){
for(nextIndex = 1;nextIndex<length;nextIndex++){
for(compareIndex=nextIndex;compareIndex>0;compareIndex--){
if(arr[compareIndex]<arr[compareIndex-1){
int temp = arr[compareIndex];
arr[compareIndex] = arr[compareIndex-1];
arr[compareIndex-1] = temp;
}
}else{
break;
}
}
}
}
好了,看到這裏,一個簡單的思路實現就已經結束了。不知道大家對照着代碼和前面的思路能不能對插入排序有所理解呢?如果沒有,請多看幾遍,建議畫一下每一步的流程圖來方便理解。
當然,以上代碼還可以再次優化的,只是優化的地方在於美觀。我們發現,我們在循環裏面又用了一次的判斷,但這個判斷的實際意義不大,因此我們把他簡化一下~
void insertSort(int[] arr){
int length =arr.length;
int nextIndex;
int compareIndex;
if(length>1){
for(nextIndex = 1;nextIndex<length;nextIndex++){
for(compareIndex=nextIndex;compareIndex>0&&arr[compareIndex]<arr[compareIndex-1]?1:0;compareIndex--){
int temp = arr[compareIndex];
arr[compareIndex] = arr[compareIndex-1];
arr[compareIndex-1] = temp;
}
}
}
}
好啦,插入排序就介紹到這裏,如果有疑問,歡迎評論指出,共同探討~
下一章:常見的排序算法 ——希爾排序,敬請期待~