直接插入排序比较次数_程序员必须要会的直接插入排序算法
算法主要衡量標(biāo)準(zhǔn)
時(shí)間復(fù)雜度(運(yùn)行時(shí)間)
在算法時(shí)間復(fù)雜度維度,我們主要對(duì)比較和交換的次數(shù)做對(duì)比,其他不交換元素的算法,主要會(huì)以訪問(wèn)數(shù)組的次數(shù)的維度做對(duì)比。
其實(shí)有很多同學(xué)對(duì)于算法的時(shí)間復(fù)雜度有點(diǎn)模糊,分不清什么所謂的 O(n),O(nlogn),O(logn)...等,也許下圖對(duì)一些人有一些更直觀的認(rèn)識(shí)。
空間復(fù)雜度(額外的內(nèi)存使用)
排序算法的額外內(nèi)存開(kāi)銷和運(yùn)行時(shí)間同等重要。 就算一個(gè)算法時(shí)間復(fù)雜度比較優(yōu)秀,空間復(fù)雜度非常差,使用的額外內(nèi)存非常大,菜菜認(rèn)為它也算不上一個(gè)優(yōu)秀的算法。
結(jié)果的正確性
這個(gè)指標(biāo)是菜菜自己加上的,我始終認(rèn)為一個(gè)優(yōu)秀的算法最終得到的結(jié)果必須是正確的。就算一個(gè)算法擁有非常優(yōu)秀的時(shí)間和空間復(fù)雜度,但是結(jié)果不正確,又有什么意義呢?
原理
每次在無(wú)序的列表中取一個(gè)元素插入到一個(gè)有序列表的適當(dāng)位置,成為一個(gè)元素加1的新的有序列表。。
插入排序根據(jù)原理又分為 直接插入排序、二分插入排序、希爾排序等,今天主要講一下直接插入排序。*直接插入排序是一種穩(wěn)定的排序算法
假設(shè)排序順序從左至右,具體步驟如下:
1. 列表第一個(gè)元素和前面元素比較,如果小于前面元素(其實(shí)不存在),則交換位置。(這步其實(shí)可以沒(méi)有)
2. 列表第二個(gè)元素和前面元素(第一個(gè)元素)比較,如果小于前面元素,則交換位置。
3. 列表第三個(gè)元素和前面元素(第二個(gè)元素)比較,如果小于前面元素,則交換位置。如果和前面元素交換了位置,現(xiàn)在在第二個(gè)位置上,則接著繼續(xù)和前面元素比較(第一個(gè)元素),如果小于前面元素,接著再次交換位置,然后再次重復(fù)比較過(guò)程....
...繼續(xù)重復(fù)以上過(guò)程,直到最后一個(gè)元素完成比較
比較移動(dòng)過(guò)程中,如果元素不需要移動(dòng)意味著該元素排序完畢。
網(wǎng)絡(luò)上的插入排序大多都是新建一個(gè)有序列表用來(lái)存放最終結(jié)果,其實(shí)在無(wú)序列表上進(jìn)行排序操作空間復(fù)雜度才更優(yōu)
也許一張更直觀的圖比上千句話效果都好:
復(fù)雜度
時(shí)間復(fù)雜度
1. 比較次數(shù)
對(duì)于長(zhǎng)度為N的主鍵不重復(fù)的列表,插入排序 平均情況下需要n2/4次比較,最壞情況下需要n2/2次比較,最好的情況下需要n-1 次比較。
2. 交換次數(shù)
對(duì)于長(zhǎng)度為N的主鍵不重復(fù)的列表,插入排序平均情況下需要n2/4次交換,最壞情況下需要n2/2次交換,最好情況下需要0次交換。
性能和特點(diǎn)
總體來(lái)說(shuō),直接插入排序是一種比較簡(jiǎn)單的排序算法,很容易理解也很好用代碼實(shí)現(xiàn),當(dāng)然他的特點(diǎn)也很明顯:
運(yùn)行時(shí)間和數(shù)據(jù)初始狀態(tài)有關(guān)
插入排序的思想是把一個(gè)元素插入一個(gè)有序的列表中,假如這個(gè)元素的位置正好是有序部分的末尾呢?也就是說(shuō)當(dāng)前元素不用移動(dòng)位置。
再一次假如整個(gè)列表都是有序的會(huì)發(fā)生什么情況呢?根本就不需要移動(dòng)任何元素。這也就是為什么在最好的情況下交換次數(shù)為0,比較次數(shù)為n-1的原因。
假如列表的很大一部分元素是有序的,插入排序可能比大多數(shù)排序算法都要快。
適用場(chǎng)景
直接插入排序?qū)τ谛⌒土斜砘蛘叻请S機(jī)元素列表很有效。例如:部分元素有序。大體可歸納為:
1. 每個(gè)元素距離自己的最終位置都不遠(yuǎn)。
2. 一個(gè)有序的大列表連接一個(gè)小列表。
3. 列表中只有少數(shù)元素不正確。
其他
為什么插入排序是穩(wěn)定呢?
插入排序是在一個(gè)已經(jīng)有序的小序列的基礎(chǔ)上,一次插入一個(gè)元素。當(dāng)然,剛開(kāi)始這個(gè)有序的小序列只有1個(gè)元素,就是第一個(gè)元素。比較是從有序序列的末尾開(kāi)始,也就是想要插入的元素和已經(jīng)有序的最大者開(kāi)始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見(jiàn)一個(gè)和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后順序沒(méi)有改變,從原無(wú)序序列出去的順序就是排好序后的順序,所以插入排序是穩(wěn)定的。
實(shí)現(xiàn)案例
static void Main(string[] args) { List data = new List() ; for (int i = 0; i < 10; i++) { data.Add(new Random(Guid.NewGuid().GetHashCode()).Next(1, 100)); } //打印原始數(shù)組值 Console.WriteLine($"原始數(shù)據(jù): {string.Join(總結(jié)
以上是生活随笔為你收集整理的直接插入排序比较次数_程序员必须要会的直接插入排序算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux模式匹配运算符,linux之正
- 下一篇: 激战服务器位置,如何选服务器 《激战2》