今天剛剛寫完資料結構學習內部排序篇的學習日誌,上網瀏覽一下網頁又發現了幾種自己完全沒聽過的排序演算法。好吧好吧,我承認自己的確是菜鳥。 = =
計數排序
想寫個計數排序,結果弄了一整天字元陣列,呵呵,基礎差沒辦法。
先介紹一下什麼是計數排序吧:這是乙個限制很大的演算法,雖然效率可以達到o(n),但是應用範圍不廣。它的基本思想就是不通過比較來排序,而是通過直接統計元素在序列中應排位置的方法。他的演算法是這樣的:
首先,假設需要排序的元素的範圍在0-k之內(多麼大的乙個限制啊)。然後建立乙個計數陣列,大小就是[0..k],陣列中的每一位分別對應待排序序列的相應的數字,比如說待排序列中有乙個32,那麼count[32]對應的就是32在待排序列中出現的總次數(32有可能出現多次)。
通過遍歷一次待排序列,統計得到乙個count陣列,然後對這個陣列作累加統計操作(有點類似於高數時候的積分),即for i=0 to k , 這樣就得到乙個遞增序列。而這個序列就是元素在
排序後排序中所應該存放的位置。最後只需要根據這個遞增序列,將待排序列中的元素輸出到結果序列中就完成了。
其中這種方法還是挺簡單的,看看源**好了:
code:
#include
#include
const
int list_length = 30;
const
int char_length = 128;
char *testcase[list_length] = ;
//function definition
char** countsort(char **source);
//function implementation
char** countsort(char **source);
int i;
//generate the count array
for (i=0;i
for (i=1;i
int pos;
for (i=0;ipos = count[**(source+i)] -1 ;
count[**(source+i)]--;
*(result+pos) = *(source+i);
} return result;
} //test function
void testcountsort()
} //main function
void main()
to be con..
JS 排序演算法之計數和基數排序
目錄 利用陣列的index是天然有序的特徵來排序.例如 已知乙個亂序陣列的範圍是0 10,長度未知,我們只需要遍歷一遍陣列,點出每個值出現的次數,並用乙個新陣列來儲存這個次數,就能做到排序.假如數字1出現3次,那麼新陣列newary 1 3,在新陣列遍歷的時候輸出3次 1 特點 先遍歷陣列計算數值出...
演算法導論5 基數排序和計數排序 2016 1 5
今天的這個比較神奇,是乙個線性複雜度的排序演算法o n 演算法導論在這一部分先證明了比較排序的複雜度下界是nlgn,所以基數排序不是基於比較的排序。其實這種比較方法我們應該都接觸過。假設輸入的數都是三位以下的數 當然其他位數也可以,模擬一下,這裡就假設是三位數 兩位數 一位數 那麼只需要大致3n的複...
演算法筆記 桶排序 計數排序 基數排序
三種時間複雜度是 o n 的排序演算法 桶排序 計數排序 基數排序。因為這些排序演算法的時間複雜度是線性的,所以我們把這類排序演算法叫作線性排序 linear sort 桶排序 bucket sort 將要排序的資料分到幾個有序的桶裡,每個桶裡的資料再單獨進行排序。桶內排完序之後,再把每個桶裡的資料...