﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-I smell magic in the air-随笔分类-编程珠玑</title><link>http://www.cppblog.com/izualzhy/category/18878.html</link><description>坚持 相信自己</description><language>zh-cn</language><lastBuildDate>Tue, 20 Mar 2012 12:57:31 GMT</lastBuildDate><pubDate>Tue, 20 Mar 2012 12:57:31 GMT</pubDate><ttl>60</ttl><item><title>《编程珠玑》之一开篇文件排序问题</title><link>http://www.cppblog.com/izualzhy/archive/2012/03/20/168427.html</link><dc:creator>izualzhy</dc:creator><author>izualzhy</author><pubDate>Tue, 20 Mar 2012 12:04:00 GMT</pubDate><guid>http://www.cppblog.com/izualzhy/archive/2012/03/20/168427.html</guid><wfw:comment>http://www.cppblog.com/izualzhy/comments/168427.html</wfw:comment><comments>http://www.cppblog.com/izualzhy/archive/2012/03/20/168427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/izualzhy/comments/commentRss/168427.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/izualzhy/services/trackbacks/168427.html</trackback:ping><description><![CDATA[<p>题目就不多说了，开篇第一个题目。</p> <p>大意就是在给定内存1.25M以内，给最多包含n个正整数的文件数据排序的问题，n=10^7</p> <p>1.</p> <p>首先是生成一个该文件的问题，类似于洗牌算法得到一组随机不重复的数字。</p><pre class="code"><span style="color: green">/*
 * =====================================================================================
 *       Filename:  creatDataFile.c
 *    Description:  create random digital repeatable data
 *        Created:  03/17/2012 01:11:38 AM
 *       Compiler:  gcc
 *
 *         Author:  zhy (), izualzhy@163.com
 *        Company:  
 * =====================================================================================
 */

</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;stdio.h&gt;
</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;stdlib.h&gt;
</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;time.h&gt;

</span><span style="color: blue">#define </span>N 100<span style="color: green">/*00000*/
</span><span style="color: blue">#define </span>k 10<span style="color: green">/*00000*/

</span><span style="color: blue">int </span>main()
{
    <span style="color: blue">unsigned int </span>i = 0;
    srand(time(NULL));
    <span style="color: blue">unsigned int </span>*<span style="color: blue">array </span>= (<span style="color: blue">unsigned int</span>*)malloc(<span style="color: blue">sizeof</span>(<span style="color: blue">unsigned int</span>)*N);

    <span style="color: blue">for </span>( i=0; i&lt;N; ++i)
        <span style="color: blue">array</span>[i] = i;


    <span style="color: blue">for </span>( i=0; i&lt;k; ++i) {
        <span style="color: blue">unsigned </span>temp = <span style="color: blue">array</span>[i];
        <span style="color: blue">unsigned </span>randomIndex = rand()%(N-i)+i;
        <span style="color: blue">array</span>[i] = <span style="color: blue">array</span>[randomIndex];
        <span style="color: blue">array</span>[randomIndex] = temp;
    }

    FILE* fp;
    fp = fopen(<span style="color: #a31515">"data"</span>,<span style="color: #a31515">"w+"</span>);
    <span style="color: blue">for </span>( i=0; i&lt;k; ++i)
        fprintf(fp,<span style="color: #a31515">"%d\n"</span>,<span style="color: blue">array</span>[i]);
    free(<span style="color: blue">array</span>);

    <span style="color: blue">return </span>0;
}

</pre>
<p>代码里N即为数字可能的最大值，k为生成的个数。为了方便表示结果，N=100，k=10；</p>
<p>生成的data数据：</p>
<p>79<br>93<br>83<br>16<br>29<br>9<br>80<br>3<br>5<br>15<br></p>
<p>2.</p>
<p>接下来就是位图表示并排序。</p><pre class="code"><span style="color: green">/*
 * =====================================================================================
 *       Filename:  sortDataByBitMap.c
 *        Created:  03/20/2012 12:17:46 PM
 *       Compiler:  gcc
 *
 *         Author:  zhy (), izualzhy@163.com
 *        Company:  
 * =====================================================================================
 */

</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;stdio.h&gt;
</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;stdlib.h&gt;

</span><span style="color: blue">#define </span>N 100<span style="color: green">/*00000*/
</span><span style="color: blue">#define </span>k 10<span style="color: green">/*00000*/

</span><span style="color: blue">#define </span>BITSPERWORD 32

<span style="color: blue">int </span>main()
{
    <span style="color: blue">int array</span>[N/BITSPERWORD+1];
    memset(<span style="color: blue">array</span>,0,<span style="color: blue">sizeof</span>(<span style="color: blue">array</span>));

    FILE* fp = fopen(<span style="color: #a31515">"data"</span>,<span style="color: #a31515">"r"</span>);
    <span style="color: blue">unsigned int </span>ui,i=0;
    <span style="color: blue">for</span>( i=0; i&lt;k; ++i) {
        fscanf(fp,<span style="color: #a31515">"%d"</span>,&amp;ui);
        <span style="color: blue">if </span>((<span style="color: blue">array</span>[ui/BITSPERWORD]&gt;&gt;(ui%BITSPERWORD) &amp; 1) == 1)
            printf(<span style="color: #a31515">"digits repeated!?\n"</span>);
        <span style="color: blue">else
            array</span>[ui/BITSPERWORD] |= 1&lt;&lt;ui%BITSPERWORD;
    }
    fclose(fp);

    fp = fopen(<span style="color: #a31515">"sortdata"</span>,<span style="color: #a31515">"w"</span>);
    <span style="color: blue">int </span>j = 0;
    <span style="color: blue">for </span>( i=0; i&lt;N; ++i)
        <span style="color: blue">if </span>((<span style="color: blue">array</span>[i/BITSPERWORD]&gt;&gt;i%BITSPERWORD &amp; 1)==1) {
            fprintf(fp,<span style="color: #a31515">"%d\n"</span>,i);
            ++j;
        }
    fclose(fp);

    <span style="color: blue">return </span>0;
}

</pre>
<p>注意N，k与前一个要一致。</p>
<p>sortData内容：</p>
<p>3<br>5<br>9<br>15<br>16<br>29<br>79<br>80<br>83<br>93</p><img src ="http://www.cppblog.com/izualzhy/aggbug/168427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/izualzhy/" target="_blank">izualzhy</a> 2012-03-20 20:04 <a href="http://www.cppblog.com/izualzhy/archive/2012/03/20/168427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>