也許有人會問,上述結果是否對于所有的輸入問題樣本都成立?第二種排序算法對于同等規模的其他資料樣本表現會如何呢?
輸入資料可能包含大量已排好序的元素。
輸入資料可能包含重複值。
無論輸入資料規模n是多少,元素集合都可以從一個非常小的資料集擴充而來,隻不過會有相當多的重複值。
從圖2-1上可以看出,第四種排序算法雖然在排序n個亂序字元串時最慢,但它在處理已經排好序的資料時卻是最快的。不過,這種領先優勢消失得非常快,如圖2-2所示,在排序32個亂序的字元串時,第三種排序算法的性能最好。
圖2-2:處理完全或者幾乎有序的資料時,排序算法的性能
盡管如此,如果一個包含n個字元串的輸入“近乎有序”,比如輸入數組由有序數組中n/4的字元串(占總字元串的25%)與距離其4個位置的元素交換而得。那麼,最終結果會有些出乎意料,如圖2-3所示,第四種排序算法的性能表現要遠遠好于其他排序算法。
對于許多問題來說,單一的最優算法并不存在。選擇一個算法需要對問題有着充分的了解,并且知道這個問題将要處理資料規模的機率分布情況,此外還必須考慮算法的實際行為。
這裡提供了一些指導性的資訊。算法通常可以按以下三類情況進行分析:
最壞情況
最壞情況是指算法對于一類問題樣本表現出的最壞性能。通常,算法設計人員在描述最壞情況時,會指出導緻算法無法高效執行的輸入資料的特征,而并非找出特定的輸入資料。
平均情況
平均情況是指算法在随機給定的資料上期望的執行情況。某些問題樣本可能會由于一些特例而導緻程式需要更長的時間才能完成,但是大多數情況都并非如此。平均情況描述了一般使用者對算法性能的期望。
最好情況
最好情況是指算法對于一類問題樣本表現出的最好性能。對于這類樣本,算法隻需要執行很少的計算。在實際情況中,最好情況很少出現。
通過了解算法在每種情況下的性能,讀者就能判斷它是否适用于特定場景。
圖2-3:第四種排序算法在處理幾乎有序的資料時性能最好