面試官問你排序算法最基礎的這幾問,把這篇文章扔給他

前段時間,好多小禹禹徵詢是否可以更新排序算法相關的內容,所以就有了這個 「排序算法」專題,也很感謝這些提需求的小禹禹,恭喜你是第一次看到這個專題,也希望你從中有所收穫。今天主要針對一些排序算法最基本的問題給出回答,如果有所困惑,歡迎評論區留言分享,後面在更新的時候,景禹就都會考慮進來。

什麼是就地排序(in-place sorting)?

一個就地排序算法使用恆定的的額外空間來產生輸出(僅修改給定的數組)。它僅通過修改線性表中元素的順序來對線性表進行排序。例如,插入排序(Insertion Sort)和選擇排序(Selection Sort)是就地排序算法,因爲它們不使用任何額外的空間來對線性表進行排序。而歸併排序(Merge Sort)和計數排序(Counting Sort)的經典實現就不是就地排序算法。

什麼是內部排序和外部排序?

當所有待排序記錄不能被一次載入內存進行處理時,這樣的排序就被稱爲外部排序。外部排序通常應用在待排序記錄的數量非常大的時候。歸併排序以及它的變體都是典型的外部排序算法。外部排序通常與硬盤、CD等外部存儲器(輔存)關聯在一起。

當所有待排序記錄可以一次載入內存時,則稱爲內部排序。

什麼是穩定排序?

當我們對可能存在重複鍵的鍵值對(例如,人名作爲鍵,其詳細信息作爲值)按照鍵對這些對象進行排序時,穩定性就顯得至關重要。

如何判定一個排序算法的是穩定的呢?

如果兩個具有相等關鍵字的對象在排序前後的相對位置沒有發生變化,則認爲排序算法是穩定的。可以形式化地描述爲:

 表示一個待排序的數組, 表示數組 的一個嚴格的弱排序(即有重複元素)。一個排序算法穩定,當且僅當   ,且隱含 ,其中  表示排序後的序列(排序算法將 移動到了 的位置,將 移動到了 的位置,但是 的相對位置保持不變)。

形式化感覺瞬間高大上,但是景禹一貫風格,通俗易懂,所以看一下下面的例子。

圖中展示的就是穩定排序的例子,簡單來講,排序前,青色球 10 在紅色球 10 的前面,那麼排序後兩者的相對位置並沒有改變,青色球 10 還是在紅色球的前面;排序前紅色球 20 在青色球 20 的前面,則排序後兩者的兩者的位置沒有發生變化,依舊是紅色在青色的前面。

簡而言之,排序前後序列中鍵值相等的元素的相對位置沒有發生變化的就是穩定排序

難道我們僅關心像整數數組這樣的簡單數組?

當鍵值相等的元素不可區分時,例如整數,或更一般地說,用於排序的鍵值即爲數據本身,穩定性無足輕重。同樣,當所有鍵值都不相同,那麼也不用去關注排序算法的穩定性問題。但真實情況是複雜的,往往是對一個複雜類型的數組排序,而排序的鍵值僅是這個元素的一個屬性。對於一個簡單類型(整型),數字值就是其全部意義,即使交換了也看不出什麼不同。但是對於複雜的類型,交換的話可能就會使原本不應該交換的元素交換了。比如,一個“學生”數組,按照年齡屬性排序,“學生”這個對象不僅含有“年齡”,還有其他很多屬性,穩定排序會保證比較時,如果兩個年齡相同的學生的相對位置不變。

一起看一個簡單的例子,來理解一下這上面一段話。

考慮以下球星姓名及其各自的等級(段位)數據集。

如果僅根據球星的姓名對數據進行排序,則結果數據集也不太可能根據他們各自的等級進行分組。

因此,我們可能還必須再次按照等級進行排序才能獲得一個滿意的球星名單。此時如果排序算法不穩定,我們可能會得到如下結果:

此時根據球星的等級進行了排序,但卻忽略了球星的姓名次序。在原始的數據集當中,Bill(比爾)是在 Embiid(恩比德)的前面的,但是當排序算法不穩定時,這種相對次序被丟失了。

而使用穩定的排序算法對原始數據集按照等級進行排序,就不會丟失這些相對次序信息,穩定排序結果:

上圖中穩定排序保證原始數據中元組之間的相對次序信息保留了下來,這也正是我們所需要看到的。

哈哈,這裏順帶說一下,杜蘭特、詹姆斯、庫裏、比爾、恩比德我都挺喜歡,個人認爲他們等級都是 No. 1,這裏爲了說明問題才搗鼓出的 A 和 B。希望沒有激怒忠實球友~~

哪些排序算法是穩定的呢?

冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、歸併排序(Merge Sort)和計數排序(Counting Sort)等本身就具有穩定排序的特質。

基於比較的排序算法,例如歸併排序和插入排序,他們是如何保證穩定性的呢?

就升序排列而言,元素 位於 之前當且僅當  表示數組的索引且 。當 時,如果 ,也就是  位於 之前,原始數據中的相對次序才能被保留下來。

非基於比較的排序算法,例如計數排序,通過確保以相反的順序填充已排序的數組來保持穩定性,以使鍵值相等的元素的的相對位置不變。

哪些排序算法是不穩定的呢?

快速排序(Quick Sort)和 堆排序(Heap Sort)等就是不穩定的排序算法,但是這些排序算法可以通過將元素的相對次序考慮進來而變得穩定,方法就是空間換時間,開闢一些額外的空間(大概 ) 以實現穩定性。

是否可以使任何排序算法都變得穩定呢?

答案是肯定的。任何排序算法都可以通過指定的方式變得穩定,可以通過修改鍵值的比較操作將本質上不穩定的任何基於比較的排序算法修改爲穩定,保證鍵值相等的兩個元素在排序前後的相對位置不變。

排序算法初探就到這裏,沒有學過相關排序算法,難免會對哪些排序算法穩定,哪些排序算法不穩定理解不是很到位,但是至少你知道了什麼是穩定排序,知道了什麼是,喜歡景禹的文章(或者景禹)就點個文末的在看,週六愉快呀~~

作者:景禹,一個求極致的共享主義者,想帶你一起擁有更美好的生活,化作你的一把傘。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章