插入排序也算是比較知名的一種排序演算法,雖然沒有快速排序用處廣,今天就分析一下插入排序。
一、認識插入排序
插入排序的思想其實很好理解,比如說學生按照身高排位置。前n-1個同學是有序的,那麼第n個同學就乙個乙個從低到高比較,找到合適的位置插入即可。
鬥地主的時候我們洗牌,就是根據大小插入或者是選擇出什麼牌,下面我們使用一張**來演示一下什麼是插入排序:
注意:
黃色部分:已經排好序的元素二、**實現說實話插入排序的改進還是有很多種方式的,我們從最簡單的插入排序出發,介紹幾個;青色部分:將要排序的元素
底部紅色:正在排序的元素
我們在正式介紹每一種之前,看乙個工具方法,用於展示陣列元素。
public
static
void
display
(int
arr)
};
1、普通插入排序方法
public
static
void
insertone
(int
array)
array[insertpoint +1]
= temp;
// 找到了插入位置,插入元素
display
(array,counter)
; counter++;}
}
這就是最簡單的插入排序,我們可以發現,每次找插入位置的時候我們都要從頭到尾乙個乙個比較。當資料量大的時候我們肯定不允許。於是我們換一種想法。使用我們之前學過的一種二分法查詢的思想,使用二分法查詢應該插入的位置。
2、二分插入排序方法
public
void
inserttwo
(int
array)
array[insertindex]
= temp;
}display()
; counter++;}
}
我們看一下二分查詢是如何找到應該插入位置的下表的。
public
intbinarysearch
(int lowerbound,
int upperbound,
int target)
else
}return lowerbound;
}
這種情況,的確很優秀。不過我們有沒有發現,我們在找插入位置的時候時間效率的確提高了,但是空間效率卻沒有提高,因為每次找到位置之後,我們都需要對插入位置其後面的元素往後移動一下,留出來這個位置。那麼在空間上就需要很大的一塊。我們再換一種思路,每次移動元素的時候,新開闢乙個空間,用作移動元素的空間。
3、二路插入排序方法
public
void
insertthree
(int
array)
//開始排序
for(
int i=
1;i)//小於最小元素,直接插到first前面,不用移動元素
else
if(array[i]
< newarray[first]
)//在最大值與最小值之間,且大於等於樞紐元素,插入到last之前,需要移動元素
else
if(array[i]
>= newarray[0]
)while
(newarray[curindex]
>array[i]);
newarray[curindex+1]
= array[i];}
//在最大值與最小值之間,且小於樞紐元素,插入到first之後,需要移動元素
else
while
(newarray[curindex]
<=array[i]);
newarray[
(curindex-
1+len)
%len]
= array[i]
;//插入到正確的位置
}display
(newarray);}
//for迴圈結束
}
上面這種方法**很長,但是時間和空間效率的確高了很多。其實還有很多其他插入排序的改進,比如說希爾排序。在這裡就先不講了,我們下面來分析一下這個插入排序:
三、分析插入排序
插入排序我們只分析第一種最簡單的插入排序。分析插入排序也是要分兩種情況:
1、在最壞情況下,陣列完全逆序
這時候插入第2個元素時要考察前1個元素,插入第3個元素時,要考慮前2個元素,以此類推,插入第n個元素,要考慮前 n - 1 個元素。因此,最壞情況下的比較次數是 1 + 2 + 3 + … + (n - 1),結果為 n^2 / 2,所以最壞情況下的複雜度為 o(n^2)。
2、最好情況下,陣列已經是有序
第2個元素時要考察前1個元素,插入第3個元素時,要考慮前2個元素,以此類推,插入第n個元素,要考慮前 n - 1 個元素。因此,最壞情況下的比較次數是 1 + 2 + 3 + … + (n - 1),結果為 n^2 / 2,所以最壞情況下的複雜度為 o(n^2)。
2、最好情況下,陣列已經是有序
這時候每插入乙個元素,只需要考查前乙個元素,因此此時插入排序的時間複雜度為o(n)。
乙個前端菜鳥面試官的體會
因為工作專案需要,上週急聘一位前端開發人員。老闆的要求是,基礎要紮實,移動端有開發經驗,能快速上手,這就可以了 來面試的那些人怎麼說呢,簡歷基本都是高大上 相信老闆初篩簡歷的時候也是稍微用心了 都是豐富的pc 移動端開發經驗,簡歷裡面的技術特長 工作經歷 專案經歷加起來基本沒有少於3頁紙的。然而,他...
乙個面試官會問的問題 關於Block的
首先迴圈引用發生的條件就是持有這個block的物件,被block裡邊加入的物件持有。當然是強引用。所以uiview的動畫block不會造成迴圈引用的原因就是,這是個類方法,當前控制器不可能強引用乙個類,所以迴圈無法形成。afnetworking是因為人家大神自己封裝了乙個completionbloc...
不要小看乙個redis,吊打面試官的硬核技能
01預習資料,學前必看 錄播 預習資料,學前必看 2分鐘 02訓練營第一天 直播 redis的5大value型別解析 4月10日 20 00 20 30 直播 redis實現活躍使用者 使用者統計 4月10日 20 30 21 00 直播 redis實現推薦系統 商品詳情頁 4月10日 21 30 ...