您的位置:首页 > 其它

【题目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!.

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: