Pearls1

作者: 百炼 | 来源:发表于2016-12-01 22:27 被阅读0次

    [TOC]

    使用常量来设置、清除以及测试位值:

    提示:MASK 0x1f 2的SHIFT(5)次方,32位,把int型的变量每一位都当作一个标记。

    /* Copyright (C) 1999 Lucent Technologies */
    /* From 'Programming Pearls' by Jon Bentley */
    
    /* bitsort.c -- bitmap sort from Column 1
     *   Sort distinct integers in the range [0..N-1]
     */
    #include <stdio.h>
    
    #define BITSPERWORD 32
    #define SHIFT 5
    #define MASK 0x1F
    #define N 10000000
    int a[1 + N/BITSPERWORD];
    
    void set(int i) {        a[i>>SHIFT] |=  (1<<(i & MASK)); }
    void clr(int i) {        a[i>>SHIFT] &= ~(1<<(i & MASK)); }
    int  test(int i){ return a[i>>SHIFT] &   (1<<(i & MASK)); }
    
    int main()
    {   int i;
        for (i = 0; i < N; i++)
            clr(i);
    /*  Replace above 2 lines with below 3 for word-parallel init
        int top = 1 + N/BITSPERWORD;
        for (i = 0; i < top; i++)
            a[i] = 0;
     */
        while (scanf("%d", &i) != EOF)
            set(i);
        for (i = 0; i < N; i++)
            if (test(i))
                printf("%d\n", i);
        return 0;
    }
    

    使用qsort快速排序

    提示:
    void qsort(voidbase,size_t num,size_t width,int(__cdeclcompare)(const void,const void));
    各参数:1. 待排序数组首地址 2. 数组中待排序元素数量 3. 各元素的占用空间大小 4. 指向函数的指针

    #include <stdio.h>
    #include <stdlib.h>
    
    int intcomp(int *x, int *y)
    {   return *x - *y;
    }
    
    int a[1000000];
    
    int main()
    {   int i, n=0;
        while (scanf("%d", &a[n]) != EOF)
            n++;
        qsort(a, n, sizeof(int), intcomp);
        for (i = 0; i < n; i++)
            printf("%d\n", a[i]);
        return 0;
    }
    

    使用标准库版本的排序

    #include <iostream>
    #include <set>
    using namespace std;
    
    int main()
    {   set<int> S;
        int i;
        set<int>::iterator j;
        while (cin >> i)
            S.insert(i);
        for (j = S.begin(); j != S.end(); ++j)
            cout << *j << "\n";
        return 0;
    }
    

    1.6 习题

    1.4 . 如何生成位于0至n-1之间的k个不同的随机顺序的随机整数? 尽量使你的程序简短且高效。

    //生k个成0~n-1之间的随机数(k<n) 
    #include<iostream>
    #include<time.h>
    #include <stdlib.h>     /* srand, rand */
    using namespace std; 
    int const N = 10000;
    int a[N];
    int main(void)
    {
        int i,j,k=10;
        for(i = 0 ;i < N; i++)
            a[i] = i;
    
        //初始化随机种子,产生随机数 
        srand((unsigned)time(NULL));
        for(i = 0 ; i < k; i ++)
        {
            int tmp = rand() % (N - i); 
            cout << "tmp ->" << tmp << endl;
            swap(a[tmp],a[N-i]);
        }
        for(i = N - 1 ; i > N - k;i--)
        {
            cout<<a[i]<<endl;
        }
        return 0;
    } 
    

    1.6 增强,生成区间内的随机数,注意生成的随机数各不相同

    /* Copyright (C) 1999 Lucent Technologies */
    /* From 'Programming Pearls' by Jon Bentley */
    
    /* bitsortgen.c -- gen $1 distinct integers from U[0,$2) */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define MAXN 2000000
    int x[MAXN];
    
    int randint(int a, int b)
    {   return a + (RAND_MAX * rand() + rand()) % (b + 1 - a);
    }
    
    int main(int argc, char *argv[])
    {   int i, k, n, t, p;
        srand((unsigned) time(NULL));
        k = atoi(argv[1]);
        n = atoi(argv[2]);
        for (i = 0; i < n; i++)
            x[i] = i;
        for (i = 0; i < k; i++) {
            p = randint(i, n-1);
            t = x[p]; x[p] = x[i]; x[i] = t;
            printf("%d\n", x[i]);
        }
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:Pearls1

        本文链接:https://www.haomeiwen.com/subject/sudfmttx.html