编程珠玑 Pearls(1)
来源:互联网 发布:c语言文件打开方式手机 编辑:程序博客网 时间:2024/05/18 01:24
[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 10000000int 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 2000000int 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;}
阅读全文
0 0
- 编程珠玑 Pearls(1)
- 编程珠玑 Pearls(2)
- 编程珠玑 Pearls(8)
- 编程珠玑 Pearls(15)
- 编程珠玑 Pearls(11 .排序)
- 编程珠玑 (续)(1) Pearls C/C++性能监测工具
- 编程珠玑 Pearls(5)编程小事
- 编程珠玑column15 strings of pearls
- 读《编程珠玑》Programming Pearls <一>
- 【编程珠玑-15章】Strings of pearls
- 编程珠玑 Pearls(3.2) python脚本
- 编程珠玑 Pearls(9. 代码调优)
- 编程珠玑 Pearls(4) 编写正确的程序
- 编程珠玑(1)
- 编程珠玑 Column 1
- 编程珠玑1
- 编程珠玑感悟<1>
- 编程珠玑笔记1
- 事件冒泡和事件捕获
- Spring学习笔记之AOP
- 编程珠玑 Pearls(2)
- linux 使用遇到的问题
- 编程珠玑 Pearls(3.2) python脚本
- 编程珠玑 Pearls(1)
- 编程珠玑 Pearls(4) 编写正确的程序
- linux shell脚本攻略笔记
- Cygwin
- 编程珠玑 Pearls(8)
- Java SE Demos and Samples 阅读笔记(1.1 db)
- 编程珠玑 Pearls(11 .排序)
- 编程珠玑 Pearls(9. 代码调优)
- CentOS