查找两个数组相同元素C语言
时间: 2023-09-12 19:03:18 浏览: 158
两个数组相同元素的查找可以采用双重循环的方式,先将其中一个数组的元素遍历,再和另一个数组的元素一一比较。如果有相同的元素,则将其输出即可。下面是一个简单的C语言代码示例:
```c
#include <stdio.h>
int main()
{
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {4, 5, 6, 7, 8};
int len1 = sizeof(arr1) / sizeof(arr1[0]);
int len2 = sizeof(arr2) / sizeof(arr2[0]);
for (int i = 0; i < len1; i++)
{
for (int j = 0; j < len2; j++)
{
if (arr1[i] == arr2[j])
{
printf("%d ", arr1[i]);
}
}
}
return 0;
}
```
该程序输出结果为:4 5,即两个数组中相同的元素。
相关问题
用C语言实现求两个数组中相同元素
在C语言中,可以使用循环和临时存储来找出两个数组中相同的元素。这里是一个简单的示例,假设我们有两个整数数组`arr1[]`和`arr2[]`,以及它们的长度`n1`和`n2`:
```c
#include <stdio.h>
// 函数声明
void findCommon(int arr1[], int n1, int arr2[], int n2);
int main() {
int arr1[] = {1, 2, 3, 4, 5};
int n1 = sizeof(arr1) / sizeof(arr1[0]);
int arr2[] = {4, 5, 6, 7, 8};
int n2 = sizeof(arr2) / sizeof(arr2[0]);
findCommon(arr1, n1, arr2, n2);
return 0;
}
// 查找并打印相同元素的函数
void findCommon(int arr1[], int n1, int arr2[], int n2) {
// 创建临时数组存放公共元素
int common[n1 + n2];
int j = 0; // 初始化计数器
for (int i = 0; i < n1 && j < n2; ++i) {
if (arr1[i] == arr2[j]) {
printf("%d ", arr1[i]); // 打印当前找到的公共元素
common[j++] = arr1[i]; // 把元素添加到common数组
}
}
// 如果还有剩余元素,说明arr2有未匹配的
while (j < n2) {
common[j++] = arr2[j - 1]; // 将arr2剩下的元素也放入common数组
}
printf("\nCommon elements are: ");
// 输出结果
for (int k = 0; k < j; ++k) {
printf("%d ", common[k]);
}
}
```
在这个例子中,`findCommon`函数会查找并打印出两个数组中相同的元素。如果需要的话,你可以稍作修改以适应其他类型的数组。
用C语言实现求两个数组中相同元素 , 并分析时间复杂度和最优解
在C语言中,我们可以使用哈希表(如`std::unordered_set`或自定义的结构体数组)来找出两个数组中的相同元素。以下是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool compare(const void* a, const void* b) {
return (*(int*)a == *(int*)b);
}
void find_common(int arr1[], int arr2[], int n1, int n2, int* common) {
if (n1 > n2) {
std::swap(n1, n2);
std::swap(arr1, arr2);
}
// 使用排序+双指针法
qsort(arr1, n1, sizeof(int), compare);
int i = 0, j = 0;
while (i < n1 && j < n2) {
if (arr1[i] == arr2[j]) {
common[i] = arr1[i]; // 或者直接添加到另一个容器中,例如unordered_set
i++, j++;
} else if (arr1[i] < arr2[j]) {
i++;
} else {
j++;
}
}
}
int main() {
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {4, 5, 6, 7, 8};
int n1 = sizeof(arr1) / sizeof(arr1[0]);
int n2 = sizeof(arr2) / sizeof(arr2[0]);
int* common_elements = malloc(n1 * sizeof(int));
memset(common_elements, 0, n1 * sizeof(int));
find_common(arr1, arr2, n1, n2, common_elements);
for (int i = 0; i < n1; i++) {
if (common_elements[i]) {
printf("Common element at index %d is %d\n", i, common_elements[i]);
}
}
free(common_elements);
return 0;
}
```
这个算法首先比较两个数组的大小,然后对较小的那个进行排序,使用两个指针遍历。当找到相同的元素时,将它们添加到结果数组`common_elements`中。
**时间复杂度分析:**
- 对于小数组,时间复杂度主要是排序操作,`qsort`的时间复杂度是O(n log n),这里n是较小数组的长度。
- 遍历过程的时间复杂度是O(min(n1, n2)),因为最多只会遍历一次。
**最优解分析:**
- 如果数据量非常大,可以考虑使用更高效的查找数据结构,比如并查集或平衡搜索树(如红黑树),这样可以在接近线性的平均时间内解决这个问题。然而,这通常只适用于特定场景,比如需要频繁地插入、删除和查找元素的情况。
阅读全文