Project 3 Hashing

Given a hash table of size N, we can define a hash function H(x) = x%N. Suppose that the linear probing is used to solve collisions, we can easily obtain the status of the hash table with a given sequence of input numbers.

However, now you are asked to solve the reversed problem: reconstruct the input sequence from the given status of the hash table. Whenever there are multiple choices, the smallest number is always taken.

Input Specification:

Each input file contains one test case. For each test case, the first line contains a positive integer N (<=1000), which is the size of the hash table. The next line contains N integers, separated by a space. A negative integer represents an empty cell in the hash table. It is guaranteed that all the non-negative integers are distinct in the table.

Output Specification:

For each test case, print a line that contains the input sequence, with the numbers separated by a space. Notice that there must be no extra space at the end of each line.

Sample Input:
11
33 1 13 12 34 38 27 22 32 -1 21
Sample Output:

1 13 12 21 33 34 38 27 22 32

基本思想

先将数据从小到大排列,然后依顺序对于每一个元素探测,如果被占用的元素大于该元素,则把他放到前面

例如

1 12 13 21 22 27 32 33 34 38

1 13 12 21 22 27 32 33 34 38

1 13 12 21 33 34 38 27 22 32

#include<stdio.h>
#include<stdlib.h>

int a[1000],c[1000],cp = 0,bp = 0,visit[1000];

void hashsort(int b[],int position,int n,int num,int flag){
	if(position == n -1)
		return;
	int i,j,tmp;
	i = b[position]%num;
	bp = position;
	while(b[bp] != a[i]){
		if(a[i]>b[bp]){
			for(j = position+1;j<n;j++)
				if(b[j] == a[i])
					break;
				if(j==n) {
					i++;
					continue;
				}
				tmp = b[j];
				while(j!=bp){
					b[j] = b[j-1];
					j--;
				}
				b[bp] = tmp;
				hashsort(b,bp,n,num,0);
				bp++;
			//c[cp++] = b[j];
		}
		i++;
		if(i == n)
			i = 0;
	}
//	c[cp++] = b[position];
	if(flag)
		hashsort(b,bp+1,n,num,1);
}
void swamp(int *a,int *b){
	int tmp;
	tmp = *a;
	*a = *b;
	*b = tmp;
}
int median3(int a[],int begin,int end){
	int mid;
	mid = (begin + end)/2;
	if(a[begin]>a[mid])
		swamp(&a[begin],&a[mid]);
	if(a[begin]>a[end])
		swamp(&a[begin],&a[end]);
	if(a[mid]>a[end])
		swamp(&a[mid],&a[end]);
	swamp(&a[mid],&a[end-1]);
	return a[end-1];
}
void Insertsort(int a[],int n){
	int i,j,tmp;
	for(i = 1;i<n;i++){
		tmp = a[i];
		for(j = i;a[i]<a[j-1]&&j>0;j--)
			a[j] = a[j-1];
		a[j] = tmp;
	}
}
void partition(int a[],int begin,int end){
	int i,j;
	int pivot;
	if(end - begin>4){
		pivot = median3(a,begin,end);
		i = 0;
		j = end-1;
		while(1){
			while(a[++i]<pivot);
			while(a[--j]>pivot);
			if(i<j)
				swamp(&a[i],&a[j]);
			else break;
		}
		swamp(&a[i],&a[end-1]);
		partition(a,begin,i-1);
		partition(a,i+1,end);
	}
	else Insertsort(a + begin,end - begin + 1);  //the array start from a + begin 
}
void quicksort(int a[],int n){
	partition(a,0,n-1);
}
int main(){
	int n,i,valid,bp;
	int *b;
	FILE *fp;
	//fp = fopen("test.txt","r");
	fscanf(stdin,"%d",&n);
	b = (int *)malloc(sizeof(int)*n);
	for(i = 0,valid = 0,bp = 0;i<n;i++){
		fscanf(stdin,"%d",&a[i]);
		if(a[i]<0)
			valid++;
		else b[bp++] = a[i];
	}
	quicksort(b,n-valid);
	hashsort(b,0,n-valid,n,1);
	for(i = 0;i<n-valid;i++){
		printf("%d",b[i]);
		if(i == n - valid - 1)
			printf("\n");
		else printf(" ");
	}
	free(b);
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值