<<AtA>>上的一道思考題.昨天開始琢磨,今天又琢磨到現在.我承認我腦袋比較迷糊,但也有點慢得讓我接受不了了."不急跬步,無以至千裡;不積小流,無以成江海",只能如此安慰自己了.呵呵.
問題本身就是,給定 N 個數的集合S, S {X | X ∈ S, 0 <= X <= k).恩.書上是1,我這裡出現的是0.多了個數罷了.要求是,修改計數排序,以完成在 O (N + K) 時間完成排序的任務,並且只能使用 O (K) 的儲存空間.
昨天剛看到的時候,比較迷糊.後來,搜了一下,便發現了方法.我想說的是,一旦我想照著別人去做,我往往做不好.並非就是如此給自己定義了,而確實是這回事呢.呵呵.自己知道方法後,安心地去寫,其實還是可以的.老想著現成的東西是怎麼做的,很難做好.還好,最終寫出來了.不然心就堵死了,一晚上得憋氣死...
核心的思想就是,把元素放在正確的位置上,放置完一種值,就將該值的計數 -1 , 當該值計數為 0 時,也就是,所有的此種值都已在正確的位置上,再次遇到無需處理,直接越過.直到,處理完所有資料.
我說得比較亂,呵呵.代碼要來了,看代碼吧.
/*8-2-e-2011-04-26-21.49.c -- 第八章第二題e*/<br />/*N 個 0 ~ K 範圍之間的關鍵字 O (N + K) 時間排序(不穩定)*/<br />#include <stdio.h><br />#include <stdlib.h><br />#include <time.h></p><p>typedef int Item ;</p><p>#define SIZE (30)<br />#define K (50)</p><p>int main (void) ;<br />void initializeArray (Item * const array, const int size, const Item k) ;<br />void countingSort (Item * const array, const int size, const Item k) ;<br />void swap (Item * const pFV, Item * const pSV) ;<br />void printArray (const Item * const array, const int size) ;</p><p>int main (void)<br />{<br />Item array[SIZE] ;<br />Item k = K ;<br />int size = SIZE ;</p><p>initializeArray (array, size, k) ;<br />printArray (array, size) ;<br />countingSort (array, size, k) ;<br />printArray (array, size) ;</p><p>return 0 ;<br />}</p><p>void initializeArray (Item * const array, const int size, const Item k)<br />{<br />int i ;</p><p>srand ((unsigned int) time (NULL)) ;<br />for (i = 0; i < size; i++)<br />array[i] = rand () % k + 1 ;<br />}</p><p>void countingSort (Item * const array, const int size, const Item k)<br />{<br />Item * count, * position ;<br />int i, index ;</p><p>count = (Item *) malloc (sizeof (Item) * (k + 1)) ;<br />if (NULL == count)<br />return ;<br />position = (Item *) malloc (sizeof (Item) * (k + 1)) ;<br />if (NULL == position)<br />{<br />free (count) ;<br />return ;<br />}<br />for (i = 0; i <= k; i++)<br />count[i] = 0 ;<br />for (i = 0; i < size; i++)<br />count[array[i]]++ ;<br />position[0] = count[0] ;<br />for (i = 1; i <= k; i++)<br />position[i] = position[i - 1] + count[i] ;<br />index = 0 ;<br />while (index < size)<br />{<br />while (index < size && 0 == count[array[index]])<br />index++ ;<br />if (size == index)<br />break ;<br />count[array[index]]-- ;<br />if (array[index] != array[--position[array[index]]])<br />swap (array + index, array + position[array[index]]) ;<br />}<br />free (count) ;<br />free (position) ;<br />}</p><p>void swap (Item * const pFV, Item * const pSV)<br />{<br />Item temp ;</p><p>temp = *pFV ;<br />*pFV = *pSV ;<br />*pSV = temp ;<br />}</p><p>void printArray (const Item * const array, const int size)<br />{<br />int i ;</p><p>for (i = 0; i < size; i++)<br />printf ("%d/n", array[i]) ;<br />putchar ('/n') ;<br />}