一.开篇

来源:互联网 发布:淘宝女式羽绒服 编辑:程序博客网 时间:2024/05/01 23:21

收获

一.一定要把问题弄清楚后在进行解答。

例如磁盘文件排序我们就需要弄清楚 文件里存储了多少数据 存储数据的范围和类型 计算机允许使用的内存 在文件中是否有相同的数据出现 

二.位图的数据结构(后边的习题解答加以详述)

三.可以实现程序的时空双赢

习题选解 首先通过 第四题生成10万个不同的小于10000000数据。

1
/*没有内存限制,直接把数据读内存,进行qsort */#include <stdlib.h>#include <stdio.h>#include <time.h>#define MAX 100005int num[MAX], n = 0;int cmp(const void *a, const void *b){return *(int *)a - *(int *)b;}int main(){freopen("data.txt", "r", stdin);while(scanf("%d", &num[n]) != EOF){n++;}qsort(num, n, sizeof(num[0]), cmp); for(int i = 0; i < n; i++){printf("%d ", num[i]);}printf("\nqsort Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);return 0;}

2 3(详细Bitmap讲解请参看http://blog.csdn.net/dweqd/article/details/6806024
/*10万个不大于10000000 数据的Bitmap应用排序。 */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#define WORD 32 // 一个int四个字节 32位 #define SHIFT 5 // 左移5位 *32,右移5为 /32 #define MASK 0x1f#define MAX 10000000int Bitmap[1 + MAX/WORD], num;/*一定要熟悉位操作 m&n等价于m%(n+1) */ void set(int i) // 把第i位置为1的操作 {Bitmap[i >> SHIFT] |= (1 << (i & MASK));}int test(int i)// 检查第i位是否为1 {return Bitmap[i >> SHIFT] & (1 << (i & MASK));}int main(){freopen("data.txt", "r", stdin);memset(Bitmap, 0, sizeof(Bitmap)); // 将数组所有为置为0,进行初始化 while(scanf("%d", &num) != EOF) // 把相应的位置为1 {set(num);}for(int i = 0; i < MAX; i++) // 从第0位开始遍历,检查为1的位,并进行输出。 {if(test(i)){printf("%d ", i);}}printf("\nBitmap Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);return 0;}

运行时间比较
4
#include <stdio.h>#include <stdlib.h>#include <time.h>#define numSum 100000#define maxNum 10000000int a[maxNum];double random(){return (double)rand() / RAND_MAX;}int random(int m){return (int)(random() * (m-1) + 0.5);}int Random(int n, int m) //产生一定区间的随机数据 {return (n + random(m-n) + 1);}void swap(int *a, int *b){int temp;temp = *a;*a = *b;*b = temp;}int main(){freopen("data.txt", "w", stdout);srand(time(NULL));for(int j = 0; j < maxNum; j++){a[j] = j;} for(int i = 0; i < numSum; i++) //后边区间生成随机数据,进行交换产生不同的随机数据 {int temp = Random(i, maxNum - 1);swap(a + i, a + temp);printf("%d ", a[i]);}return 0;}


原创粉丝点击