程式設計珠璣筆記第一章 a i SHIFT

2022-08-05 11:06:16 字數 1856 閱讀 5669

問題描述:

問題:乙個最多包含n個正整數的檔案,每個數都小於n,n = 100 00000。檔案中的正整數沒有重複的,請按公升序排列這些整數。可用記憶體空間只有1mb左右,執行時間在10秒左右。

選擇方案:

1:歸併排序,32為整數,1m的記憶體空間,每次可以讀入約250 000(25萬)個數(注意估計方法,1m 10的6次方,1百萬位元組,1g,10的9次方,10億位元組)

那就需要40次讀入,第一次遍歷檔案,對0-249 999的樹進行排序,第二次對250 000到499 999之間的數排序,瓶頸在於需要40次讀入檔案

2:利用點陣圖和位向量解決,該排序的特徵為:資料沒有重複,資料限制在較小的範圍內,除了單一整數外沒有其他的相關資料了

習題:庫語言實現排序

產生10 000 000檔案

#include #include using namespace std;

#define rand_max 10000

//rand 產生2^15次方的隨機數,bigrand產生2^30次方的隨機數,見程式設計珠璣12章如果用rand做產生的資料隨機性不太好,所以用bigrand

int bigrand()

int randint(int l,int u)

#define sourcenum 10000000

int testdata[sourcenum];//這麼大的陣列不能在main內定義,因為棧的大小有限制,定義為全域性變數,在靜態區

int main()

void clr_i(int i)

int main()

file *fpin = fopen("d:\\file2.txt","r");

file *fpout = fopen("d:\\fpout.txt","w+");

int m = 0;

for (int i = 1; i <= n;i++)

#define n 10000000

int testdata[n];

int main()

} //void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));   

qsort(testdata,10000000,sizeof(int),intcomp);

for (int i = 1; i <= n;i++)

fclose(fpin);

fclose(fpout);

endtime = clock();

cout<<(double)(endtime - begintime)/clocks_per_secfor (int i = 1; i <=n;i++) }

set::iterator siterator;

for (siterator = s.begin();siterator!=s.end();++siterator)

fclose(fpin);

fclose(fpout);

endtime = clock();

cout<<(double)(endtime - begintime)/clocks_per_sec<

《程式設計珠璣》第一章筆記

文章從乙個實際的問題開始 乙個 系統,7位數的 號碼,用1mb的記憶體空間將這些 號碼排序。分析 如果將這些 號碼看成int型別的整數,將其讀入記憶體中進行排序,int型別4個位元組,最多有10000000個 號碼,則需要40mb的記憶體空間,遠遠超出題目的要求,但是這10000000個資料有他們的...

程式設計珠璣第一章

原文中的問題 如何在1mb的空間裡面對一千萬個整數進行排序?並且每個數都小於1千萬。實際上這個需要1.25mb的記憶體空間。1mb總共有838,8608。所以估計也可以在1mb左右的空間裡面進行排序了。include include define bitsperword 32 define shif...

程式設計珠璣第一章

下午看完程式設計珠璣第一章,感覺很不錯!如作者所說 閱讀本書乙個提示,不要太快,一次閱讀一章。集中精力思考,解答課後習題。寫總結就是在剛弄懂的時候,這時候是最恰當的時候,最容易接受。題目要求 乙個最多含有1000萬個整數的檔案,整數沒有重複,請輸出公升序排列。約束 最多1m記憶體,時間10s。題目很...