1. 對下列關鍵字序列用快排進行排序時,速度最快的情形是(a) a
b cd
分析:pivotkey
的選擇越靠近**,即左右兩個子串行長度越接近,排序速度越快。
21正好是序列的正中,所以排除b,d。
a經過一次排序後結果為9,17,5,(21),25,23,30
c經過一次排序後結果為5,9,17,(21),25,23,30
對於子串行9,17,5和5,9,17,後者在有序狀態下用快速排序方法的速度沒有前者快,答案為a。
pivotkey的選擇越靠近**,即左右兩個子串行長度越接近,排序速度越快。一般第乙個數作為基準。
2. 個數約為50k的數列需要從小到大排序,數列特徵是基本逆序(多數數字從大到小,個別亂序),以下哪種排序演算法在事先不了解數列特徵的情況下效能大概率最優(不考慮空間限制):堆排序。
分析:個數約為50k,基本可以秒殺一般的`冒泡`,`改進冒泡`,`選擇`,`插入`等基本的排序。加上數列的特徵是基本逆序,而快速排序的worst case就是基本逆序或者基本有序的情況。綜上所述,堆排序應該是大概率最優的。
堆排序與初始數列次序無關。
3. 將一組無序的正整數重新排列成有序序列,其方法有:bcd
a拓撲排序 b快排 c堆排序 d基數排序
分析:在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序(英語:topological sorting)。
每個頂點出現且只出現一次;
若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。
也可以定義為:拓撲排序是對有向無環圖的頂點的一種排序,它使得如果存在一條從頂點a到頂點b的路徑,那麼在排序中b出現在a的後面。
拓撲排序是圖中判斷是否有環的演算法,在圖中查詢乙個無環的所有的節點,不是用來資料排序的。
4. 下列排序法中,每經過一次元素的交換會產生新的逆序的是(a) a
快排 b 冒泡 c 簡單插入排序 d 簡單選擇排序
分析:在資料元素的序列中,對於某個元素,如果其後存在乙個元素小於它,則稱之為存在乙個逆序。氣泡排序只交換相鄰元素,但不是每次移動都產生新的逆序。簡單插入排序每一次比較後最多移掉乙個逆序。快速排序每一次交換移動都會產生新的逆序,因為當不會有新的逆序產生時,本輪比較結束。簡單選擇排序的基本思想是先從所有 n 個待排序的資料元素中選擇最小的元素,將該元素與第乙個元素交換,再從剩下的 n-1 個元素中選出最小的元素與第 2 個元素交換,這樣做不會產生逆序。故本題答案為 a 選項。
5. 排序時,若不採用計數排序等科技換時間的方法,合併m個長度為n的已排序陣列的時間複雜度最優為:o(mn(logm))
分析:合併m個長度為n的已排序陣列的時間複雜度為o(nmlogm)。思路是:首先將m個已排序陣列的第乙個數,建立大小為m的小根堆,時間複雜度o(m)。然後每次輸出堆頂的數,再將其所屬已排序陣列的後乙個數放入堆頂,調節小根堆。因為我們有m*n個數,小根堆調整時間為o(logm),所以時間複雜度o(nmlogm)。
演算法學習 4
排序是演算法學習中最基礎的內容,也有很多中排序演算法,這裡簡單介紹學一下堆排序。理解堆排序之前,一定要先明白什麼是堆,其實它就是乙個陣列或者是陣列的一部分,一定要記住明白這一點,不然容易有一種樹結構的錯覺。它就是在陣列的元素間定義一些關係,讓這些元素看起來近似乙個二叉樹。這些元素組成的陣列就叫做堆。...
排序演算法學習
一直都想把排序和搜尋類的演算法總結一下,一直拖著沒寫,主要是太懶了,現在決定還是要再好好學習下這些基本的演算法。畢竟基礎真的是很重要。好了現在開始學習第乙個排序演算法 插入排序 我記得插入排序在我們以前的資料結構教程上是第乙個介紹的 插入排序 聽這個排序名字就是將乙個什麼數要插入到某個地方,不錯,他...
排序演算法學習
1.氣泡排序 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 排序演算法練習 從小排序 public ov...