第一題求最小值、最大值和均值顯然不用排序,只需要掃瞄一遍陣列即可。關於中值,換個思路思考,就是找排好序的陣列中的index為n/2的數,所以方法出來了
方法一:先對陣列進行排序,然後直接得到arr[n/2]即為索求的中位數,時間複雜度為o(nlgn),在這裡面如果呼叫庫函式qsort的花費的時間會比自己去寫乙個排序函式花費更多的時間,qsort最好情況為o(nlgn),所以可以用其他一些嚴格o(nlgn)的排序演算法,比如歸併排序,堆排序等等。自己去實現qsort的話,雙向的掃瞄會比單向掃瞄效率更高,且會避免所有元素相同造成的效率低下。自己實現的雙向qsort對於100000個-1000000----1000000中的隨機數大概花費20ms, 而庫函式大約花費30ms
方法二:很顯然,我們只是想求陣列中第n/2大的數,其他的數排不排好序對結果沒有影響,而我們的方法一顯然做了很多的無用功,那麼怎麼快速尋找陣列中第k大的數呢,對,方法很多的,最有效的方法就是利用快速排序的思想,快速選擇,比如我們要找第1000大的數,所以0-999的數只要比它小就行了,沒必要對他們排序,講到這裡是不是茅塞頓開了,這種方法網上資料很多,利用這種方法對相同的100000個數進行處理,花費時間<10 ms,時間複雜度大約為o(n)
#include#include#include#include#define maxline 100000
#define test 2
/* * qsort function
*/int cmp(const void *a,const void *b)
/* * method no_02 first sort,and then you can get middle value by list[n/2]
*/void my_qsort(int *list,int left,int right)
list[left] = list[j];
list[j] = key;
my_qsort(list,left,j-1);
my_qsort(list,j+1,right);
}int mid_value(int *list,int n)
/* * method no_03 by using the method of the qsort
*/int qselect(int *list, int left,int right,int index)
list[left] = list[j];
list[j] = key;
if(j==index)
return list[j];
else if(j < index)
else
}int
main(void)
int i = 0;
while(i
《程式設計珠璣》第十一章 排序
好久沒寫部落格了,最近挺忙的,忙的不可開交,可細想一下,又都是在瞎忙,渾渾噩噩的,不知自己到底忙什麼,又到底有什麼收穫。捫心自問,自己浪費了不少時間。不管怎樣,自己要把握好,有志者就要時時刻刻約束自己的行為,我要這樣嚴格要求自己,不管別人怎麼看待,也不管自己有多痛苦,堅持下去。當然,寫部落格也是一樣...
第十一章程式設計題
2.在這個題目中,我的設計的不人性化在於,我必須要求使用者給輸入自己要輸入整數的大小,然後我再給他分配記憶體,這分明是通過折磨使用者來使自己的程式變得簡單,而guide s answer則是只需要使用者輸入你該輸入的數即可。程式設計的思路如下 1.先預設一定大小 巨集定義 的記憶體分配 2.然後在讀...
程式設計珠璣第一章第一題的解法,常用的排序
程式設計珠璣第一章習題 第一題 如果不缺記憶體,如何使用乙個庫的語言實現一種排序演算法以表示和排序集合 解法一 使用c 的sort include include using namespace std template int getarrlength t arr template int get...