算法和數據結構~排序算法

排序算法種類

排序是指將元素集合按照規定的順序排列。一般有兩種排序方法,升序排列和降序排列。例如,對整數集{5,2,7,1}進行升序排列,結果爲{1,2,5,7},對其進行降序排列結果爲{7,5,2,1}。總的來講,排序的目的是使數據可以以更有意義的形式表現出來。雖然排序最顯著的應用是排列數據以顯示它,但它每每能夠用來解決其餘的問題,特別是做爲某些已成型算法的一部分。

總的來講,排序算法分爲兩大類:比較排序和線性時間排序。比較排序依賴於比較和交換來將元素移動到正確的位置上。使人驚訝的是,並非全部的排序算法都依賴於比較。對於那些確實依賴於比較來進行排序的算法來講,它們的運行時間每每不可能小於O(nlgn)。對於線性時間排序,從它的名字就能夠看出,它的運行時間每每與它處理的數據元素個數成正比,即爲O(n)。遺憾的是,線性時間排序依賴於數據集合中的某些特徵,因此咱們並非在全部的場合都可以使用它。某些排序算法只使用數據自己的存儲空間來處理和輸出數據(這些稱爲就地排序),而有一些則須要額外的空間來處理和輸出數據(雖然可能最終結果仍是會拷貝到原始的內存空間中)。
  搜索就是在一個數據集中找到一個元素的位置,它可用於任何任務中。一種最簡單的、不須要費任何腦筋的搜索方法是:簡單地從數據集的一端查找到另外一端。這就是所謂的線性搜索。一般,線性搜索用在那些對隨機訪問支持得不太好的數據結構中,例如:鏈表(見第5章)。另外一種方法是使用二分查找,這會在本章中介紹。還有一些搜索方法專門用於特定的數據結構,例如哈希表。面試

插入排序

插入排序雖然不是最有效的排序方法,但它簡單,而且不須要額外的存儲空間。其最佳應用場景是對一個小的數據集合進行遞增排序。算法

描 述 利用插入排序將數組data中的元素進行排序。data中元素的個數由size決定。而每一個元素的大小由esize決定。函數指針compare會指 向一個用戶定義的函數來比較元素大小。在遞增排序中,若是key1>key2,函數返回1;若是key1=key2,函數返回0;若是 key1<key2,函數返回-1。在遞減排序中,返回值相反。當issort返回時,data包含已排序的元素。
複雜度 O(n2),n爲要排序的元素的個數。數組

快速排序

在通常狀況下,一致認爲快速排序是最好的一種排序算法,並且不須要額外的存儲空間。其最佳應用場合是應用於大型數據集。數據結構

描述 利用快速排序將數組data中的元素進行排序。數組中的元素個數由size決定。而每一個元素的大小由esize決定。參數i和k定義當前進行排序的兩個部分,其值分別初始化爲0和size-1。函數指針compare會指向一個用戶定義的函數來比較元素大小。其函數功能與issort中描述的同樣。當qksort返回時,data包含已排序的元素。
複雜度 O(nlg n),n爲要被排序的元素的個數。函數

歸併排序

歸併排序基本上與快速排序算法的性能相同,但它須要使用兩倍於快速排序的存儲空間。而具備諷刺意味的是,其最佳應用場合是在超大數據集中,由於歸併排序的原理就是對原始的亂序數據不斷進行對半分割。性能

描述 利用歸併排序將數組data中的元素進行排序。數組中的元素個數由size決定。而每一個元素的大小由esize決定。參數i和k定義當前進行排序的兩個部分,其值分別初始化爲0和size-1。函數指針compare會指向一個用戶定義的函數來比較元素大小。其函數功能與issort中描述的同樣。當mgsort返回時,data中包含已排序的元素。
複雜度 O(nlg n),n爲要排序的元素的個數。大數據

計數排序

計數排序是一種穩定的線性時間排序算法,當知道數據集中整數的最大值的狀況下會常常用到此算法。它主要用來實現基數排序spa

描述 利用計數排序將數組data中的整數進行排序。data中的元素個數由size決定。參數k爲data中最大的整數加1。當ctsort返回時,data中包含已排序的元素。
複雜度 O(n+k),n爲要排序的元素的個數,k爲data中最大的整數加1。指針

基數排序

基數排序是逐位對元素進行排序的線性時間排序算法。基數排序適用於固定大小的元素集,而且其中的元素易於分割,且易於用整數表示。排序

描述 利用計數排序將數組data中的整數進行排序。數組data中整數的個數由size決定。參數p指定每一個整數包含的位數,k指定基數。當rxsort返回時,data包含已排序的整數。
複雜度 O(pn+pk),n爲要排序的元素的個數,k爲基數,p爲位的個。

 

感謝各位的閱讀!今天主要吃掉這個排序算法,也是面試時常常會被問到的,哈哈!

相關文章
相關標籤/搜索