磁盘排序和有关的思考


今天看编程珠玑的开头,涉及到了磁盘排序。

简单说来,就是如何利用1MB的空间实现对包含107个整数进行排序。当然比较好的条件是里面没有重复数字,最大数字不超过107。可以想成要对电话号码排序。

如果采用常用的排序算法,如归并,插入等,必然需要额外的空间,当然磁盘的空间是足够的,可以申请另外一个文件进行交互完成排序。现在考虑的角度是,如何不另外使用磁盘空间,并且不多次读数据,即一次读入内存,并完成排序。

如果从字节的角度考虑,读入的问题都是无解的。因为1MB仅有100万左右的字节,无论如何是放不下这么多数据的。当然需要从位的角度考虑,需要用每一位表示一个数,那么该如何做?


作者给出点的一个解答是采用位向量,例如:

{23,6}对应的位向量就是{0,1,1,00,1},以此类推实现存储。

按照此思想,简单完成了一个百位数内的排序,需要超过100位的数据,因而需要用到包含13个字符的数组

int bitSort()
{
    char sortRecord[13];
    const unsigned int baseNum = 0;
    const unsigned int changeNum = 1;
    int randomNum = 0;
    int row = 0;
    int column = 0;

    for(int i=0;i<13;i++)
    {
        sortRecord[i] &= baseNum;
    }

     srand((int)time(0));     
    for(int i=0;i<10;i++)
    {
        randomNum = rand()%100;
        row = randomNum/8;
        column = randomNum%8;
        sortRecord[row] |= (changeNum<<(7-column));

        printf("this random number is %d\n",randomNum);
    }

    for(int i=0;i<=100;i++)
    {
        row = i/8;
        column = i%8;

        if(sortRecord[row] & (changeNum<<(7-column)))
            printf("%d ",i);
    }
    printf("\n");

    return 1;
}

无论语言多么高级,里底层有多远,数据结构有多抽象,那么运行的时候还是要转化为01代码的机器语言。因而在使用高级语言编程的时候,不应该局限于那些类型的范畴,有时候如果仅仅把他们从01的角度考虑会另辟蹊径。

再入c++中常出现的各种强制转换,其实没有那么复杂,所谓转换并不改变赋予的二进制代码,转换的是告诉遵循规范的编译器如何看待这些01代码。同样的3201串,是看成一个整数,还是一个浮点数,还是一个地址,这都是由我们要完成的任务俩决定,但是要实行的话,确实要遵循规范提供的机制,否则编译器如何知道该怎么看待他们呢?


编程总是不断需要在底层和抽象间来回转换。抽象要用到我们本身的知识,例如用各种已知的数学模型去解决问题。但是具体到实现,如何快速的转换的机器可以执行的角度,当然要用已知的规范,但思考的时候又不可以局限于规范。


你可能感兴趣的:(磁盘排序和有关的思考)