面試官 手寫乙個插入排序,並對其改進

2021-09-27 00:24:33 字數 3054 閱讀 8858

插入排序也算是比較知名的一種排序演算法,雖然沒有快速排序用處廣,今天就分析一下插入排序。

一、認識插入排序

插入排序的思想其實很好理解,比如說學生按照身高排位置。前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 ...