数组去重(c语言实现)

起因

在九度练习acm的时候,有道题我认为应该先进行数组去重操作,由于工作中我大部分都是用php写代码,php中数组去重只要一个array_diff()函数即可实现,但是到C语言中,我就没有现成的api函数可以让我调用了,因此我自己实现了一个算法,进行数组去重,但是这个算法有明显的缺陷,我会先把算法展示出来,然后解释算法的缺陷

数组去重代码

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

#define false -1

int arraydiff(int *A, int max, int len);

int main()
{
	int a[100];
	int n, k, i, len, max;

	while(scanf("%d",&n) != EOF)
	{
		//接收客户端数据
		for(i = 0; i < n; i ++)
		{
			scanf("%d",&a[i]);
		}
		scanf("%d",&k);

		//找到a[i]的最大数
		max = a[0];
		for(i = 1; i < n; i ++)
		{
			if(max < a[i])
				max = a[i];
		}

		//数组去重加由小到大排序
		len = arraydiff(a, max, n);
		
		//输出第K大的数
		printf("%d\n",a[k - 1]);
	}

	return 0;
}

/**
 * Description:数组去重算法
 */
int arraydiff(int *A, int max, int len)
{
	int arrayflag[max + 1];
	int i, j;

	//初始化标志数组
	for(i = 0; i <= max; i ++)
	{
		arrayflag[i] = false;
	}

	//剔除算法
	for(i = 0; i < len; i ++)
	{
		arrayflag[A[i]] = A[i];
	}

	//取出有效数
	for(i = 0, j = 0; i <= max; i ++)
	{
		if(arrayflag[i] != false)
		{
			A[j ++] = arrayflag[i];
		}
	}
	return j;
}

缺陷

因为该算法需要重新申请数组空间,而数组空间的大小则是以去重数组中的最大数为标准,这样就会出现很极端的情况,我的数组int A[4] = {112000,11200,1,2},尽管需要去重的数组A大小为4,我却要重新申请112000大小的新的内存空间,这是极大的浪费

需求

希望大家能给我回帖,写出您认为比较好的数组去重算法,建议代码最好用C实现,凡是给我留言者,我必定回复
C语言中,可以通过使用STL容器来实现数组去重的功能。STL(Standard Template Library)是C++标准库的一部分,提供了一系列的容器和算法,方便开发者进行数据结构和算法的实现。 在C语言中,可以使用哈希表来实现数组去重。哈希表是一种以键值对形式存储数据的数据结构,通过将元素的值映射到一个唯一的索引位置来实现快速的查找和插入操作。 以下是使用哈希表实现数组去重的步骤: 1. 创建一个空的哈希表。 2. 遍历原始数组中的每个元素。 3. 对于每个元素,检查哈希表中是否已经存在该元素。 - 如果存在,则说明该元素已经出现过,不需要再次插入到结果数组中。 - 如果不存在,则将该元素插入到哈希表中,并将该元素添加到结果数组中。 4. 返回结果数组,即为去重后的数组。 下面是一个示例代码: ```c #include <stdio.h> #include <stdbool.h> #define HASH_SIZE 100 typedef struct Node { int value; struct Node* next; } Node; typedef struct HashTable { Node* buckets[HASH_SIZE]; } HashTable; void initHashTable(HashTable* hashTable) { for (int i = 0; i < HASH_SIZE; i++) { hashTable->buckets[i] = NULL; } } int hash(int value) { return value % HASH_SIZE; } bool contains(HashTable* hashTable, int value) { int index = hash(value); Node* node = hashTable->buckets[index]; while (node != NULL) { if (node->value == value) { return true; } node = node->next; } return false; } void insert(HashTable* hashTable, int value) { int index = hash(value); Node* newNode = (Node*)malloc(sizeof(Node)); newNode->value = value; newNode->next = hashTable->buckets[index]; hashTable->buckets[index] = newNode; } void removeDuplicates(int* arr, int size) { HashTable hashTable; initHashTable(&hashTable); int result[size]; int resultSize = 0; for (int i = 0; i < size; i++) { if (!contains(&hashTable, arr[i])) { insert(&hashTable, arr[i]); result[resultSize++] = arr[i]; } } printf("去重后的数组:"); for (int i = 0; i < resultSize; i++) { printf("%d ", result[i]); } printf("\n"); } int main() { int arr[] = {1, 2, 3, 4, 2, 3, 5}; int size = sizeof(arr) / sizeof(arr); removeDuplicates(arr, size); return 0; } ``` 运行以上代码,输出结果为:去重后的数组:1 2 3 4 5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值