【题目26】关于1-N的整数查找排序问题
2009-09-28 20:07
351 查看
题目:此题缘于《编程珠玑》,一个文件包含最多N个正整数,每一个都小于
N,每一个数都不会出现两次以上。将这个文件排序。
珠玑上的解法:
/*phase 1: initialize set to empty*/
for i = [0, n)
bit[i] = 0
/*phase 2: insert present elements into the set*/
for each i in the input file
bit[i] = 1
/*phase 3: write sorted output*/
for i = [0,n)
if bit[i] == 1
write i on the output file
下面的原代码包括下面几个问题的解决方案:
1. 给一个正整数数组,按序打印出来
2. 给出一个正整数数组,包含1到N的所有数,某一个数除外,
要你找出这个数。有两种解法,一种是用跟问题1同样的方法
用BITMAP,另外一种方法是用异或的功能
3. 给出1-N的所有正整数,要求其任意一个排列,且概率为1/n!.
N,每一个数都不会出现两次以上。将这个文件排序。
珠玑上的解法:
/*phase 1: initialize set to empty*/
for i = [0, n)
bit[i] = 0
/*phase 2: insert present elements into the set*/
for each i in the input file
bit[i] = 1
/*phase 3: write sorted output*/
for i = [0,n)
if bit[i] == 1
write i on the output file
下面的原代码包括下面几个问题的解决方案:
1. 给一个正整数数组,按序打印出来
2. 给出一个正整数数组,包含1到N的所有数,某一个数除外,
要你找出这个数。有两种解法,一种是用跟问题1同样的方法
用BITMAP,另外一种方法是用异或的功能
3. 给出1-N的所有正整数,要求其任意一个排列,且概率为1/n!.
#include <stdio.h> #include <stdlib.h> #include <time.h> #define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1F #define NUM 100 int a[1+NUM/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)); } void IntSort(int *arr, int N) { int i; for(i = 0; i < NUM+1 ; i++) Clr(i); for(i = 0; i < N; i++) Set(arr[i]); for(i = 0; i < NUM+1; i++) { if(Test(i)) { printf("%d ", i); } } } int FindNotInArr(int *arr,int N) { int i; for(i = 0; i < NUM+1 ; i++) Clr(i); for(i = 0; i < N; i++) Set(arr[i]); for(i = 1; i < NUM+1; i++) { if(Test(i) == 0) { return i; } } return -1; } int FindNotInArr2(int* arr,int N) { int i,j = 1; int res = 0; for(i = 0; i < N; i++,j++) { res ^= arr[i] ^ j; } res ^= j; return res; } void Swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } void RandomArr(int* arr, int N) { int i; srand(time(NULL)); for(i = 1; i < N+1; i++) arr[i-1] = i; for(i = N-1; i >= 0; i--) { Swap(&arr[i],&arr[rand()%N]); } } int main() { int a[] = {3,2,6,7,8,23,10}; int b[] = {2,4,3,1,6,9,8,7}; int lenA = sizeof(a)/sizeof(int); IntSort(a,lenA); int lenB = sizeof(b)/sizeof(int); printf("/n%d ",FindNotInArr(b,lenB)); printf("/n%d /n",FindNotInArr2(b,lenB)); int *c = new int[10]; RandomArr(c,10); for(int i = 0; i < 10; i++) printf("%d ", c[i]); delete[] c; return 0; }
相关文章推荐
- 关于海量数据查找排序问题
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 关于海量数据查找排序问题
- 关于数组的几个小题目-冒泡排序、二分查找、直接选择排序、反转数组
- 一个关于插入查找和排序问题
- 关于海量数据查找排序问题
- 关于海量数据查找排序问题
- 关于海量数据查找排序问题
- 面试题之10亿正整数问题续--关于多通道排序的问题
- 关于海量数据查找排序问题
- 关于海量数据查找排序问题
- 题目1153:括号匹配问题 题目26
- 关于生产者消费者排序问题
- 关于超长大整数无法使用unsigned int进行存储的问题
- 关于jsoncpp内部排序的问题
- 关于不规则列的排序问题
- 关于整数部分为0的小数在web上的显示问题
- JD_OJ 题目1007:奥运排序问题
- 【mysql】一个关于order by排序的问题
- 关于Ctrl+PageDown在使用查找功能后不能使用的问题