这个问题里面,如果合并去重后,数组出现了随机数,算错吗?如果错了怎么改进呢?

问题:编写一个程序,输入两个包含10个元素的数组,先将第一个数组采用冒泡法进行降序排列,第二个数组采用选择排序进行降序排列,然后将这两个数组合并成一个降序数组,要求合并后的数组元素不得重复。

#include <stdio.h>

// 冒泡排序
void bubble_sort(int arr[], int n) {
    int i, j;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n-1-i; j++) {
            if (arr[j] < arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

// 选择排序
void selection_sort(int arr[], int n) {
    int i, j;
    for (i = 0; i < n; i++) {
        int max_idx = i;
        for (j = i+1; j < n; j++) {
            if (arr[j] > arr[max_idx]) {
                max_idx = j;
            }
        }
        int temp = arr[i];
        arr[i] = arr[max_idx];
        arr[max_idx] = temp;
    }
}

// 合并数组并去重
void merge(int arr1[], int arr2[], int n, int m, int res[]) {
    int i, j, k;
    for (i = 0, j = 0, k = 0; i < n && j < m; ) {
        if (arr1[i] > arr2[j]) {
            res[k++] = arr1[i++];
        } else if (arr1[i] < arr2[j]) {
            res[k++] = arr2[j++];
        } else {
            res[k++] = arr1[i++];
            j++;
        }
    }
    while (i < n) {
        res[k++] = arr1[i++];
    }
    while (j < m) {
        res[k++] = arr2[j++];
    }
}

int main() {
    int arr1[10], arr2[10], res[20], i;
    printf("请输入第一个包含10个元素的数组:\n");
    for (i = 0; i < 10; i++) {
        scanf("%d", &arr1[i]);
    }
    printf("请输入第二个包含10个元素的数组:\n");
    for (i = 0; i < 10; i++) {
        scanf("%d", &arr2[i]);
    }

    bubble_sort(arr1, 10);
    selection_sort(arr2, 10);
    merge(arr1, arr2, 10, 10, res);

    printf("合并后的数组为:");
    for (i = 0; i < 20; i++) {
        printf("%d ", res[i]);
    }
    printf("\n");

    return 0;
}

#include <stdio.h>

void bubbleSort(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n-1; i++) {
        for (j = 0; j < n-i-1; j++) {
            if (arr[j] < arr[j+1]) {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

void selectionSort(int arr[], int n) {
    int i, j, maxIdx, temp;
    for (i = 0; i < n-1; i++) {
        maxIdx = i;
        for (j = i+1; j < n; j++) {
            if (arr[j] > arr[maxIdx]) {
                maxIdx = j;
            }
        }
        temp = arr[i];
        arr[i] = arr[maxIdx];
        arr[maxIdx] = temp;
    }
}

int main() {
    int arr1[10], arr2[10];
    int i, j, k, mergeArr[20], flag;

    for (i = 0; i < 10; i++) {
        scanf("%d", &arr1[i]);
    }
    
    for (i = 0; i < 10; i++) {
        scanf("%d", &arr2[i]);
    }

    bubbleSort(arr1, 10);

    selectionSort(arr2, 10);

    k = 0;
    for (i = 0; i < 10; i++) {
        mergeArr[k++] = arr1[i];
        flag = 0;
        for (j = 0; j < 10; j++) {
            if (arr2[j] == arr1[i]) {
                flag = 1;
                break;
            }
        }
        if (!flag) {
            mergeArr[k++] = arr2[i];
        }
    }

    for (i = 0; i < k; i++) {
        printf("%d ", mergeArr[i]);
    }

    return 0;
}

如果合并去重后出现了随机数,则程序结果算错。为了解决这个问题,可以使用哈希表来实现去重操作,即在合并数组的过程中,检查当前元素在前面是否出现过,若出现过则跳过,否则将该元素添加至合并后的数组中。这样可以保证合并后的数组不会出现重复元素。
以下是满足要求的C代码实现:

#include <stdio.h>

// 冒泡排序
void bubble_sort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < n-1-i; j++) {
            if (arr[j] < arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

// 选择排序
void selection_sort(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        int max_idx = i;
        for (int j = i+1; j < n; j++) {
            if (arr[j] > arr[max_idx]) {
                max_idx = j;
            }
        }
        int temp = arr[i];
        arr[i] = arr[max_idx];
        arr[max_idx] = temp;
    }
}

// 合并数组并去重
void merge_array(int arr1[], int arr2[], int n, int m, int res[], int *r_len) {
    *r_len = 0;
    int i = 0, j = 0;
    while (i < n && j < m) {
        if (arr1[i] == arr2[j]) {
            res[*r_len] = arr1[i];
            i++;
            j++;
            (*r_len)++;
        } else if (arr1[i] > arr2[j]) {
            res[*r_len] = arr1[i];
            i++;
            (*r_len)++;
        } else {
            res[*r_len] = arr2[j];
            j++;
            (*r_len)++;
        }
    }
    while (i < n) {
        res[*r_len] = arr1[i];
        i++;
        (*r_len)++;
    }
    while (j < m) {
        res[*r_len] = arr2[j];
        j++;
        (*r_len)++;
    } 
}

int main() {
    int arr1[10], arr2[10], res[20], r_len;
    printf("请输入第一个包含10个元素的数组:\n");
    for (int i = 0; i < 10; i++) {
        scanf("%d", &arr1[i]);
    }
    printf("请输入第二个包含10个元素的数组:\n");
    for (int i = 0; i < 10; i++) {
        scanf("%d", &arr2[i]);
    }

    bubble_sort(arr1, 10);
    selection_sort(arr2, 10);
    merge_array(arr1, arr2, 10, 10, res, &r_len);

    printf("合并后的不重复数组为:");
    for (int i = 0; i < r_len; i++) {
        printf("%d ", res[i]);
    }
    printf("\n");

    return 0;
}

需要注意几点:

1.对于冒泡排序和选择排序,函数参数传递正确。

2.在合并两个数组时,采用双指针法遍历两个有序数组,并且通过记录res数组长度的方式来实现去重。

3.在控制台输出合并后的不重复数组。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/682579
  • 这篇博客你也可以参考下:编写程序,输入10个整数,将其中最小的数与第一个数对换,将最大的一个数与最后一个数对换
  • 除此之外, 这篇博客: 用递归法求数组最大值中的 2.参数的规律。数组作为容器,递归函数操作的数字始终在数组里面,所以数组必须一代一代的传下去;我们要遍历数组中所有的数字,有两个下标,这两个下标都要同时往中间靠,规律如下: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

  • 您还可以看一下 张飞老师的硬件开发与电路设计速成入门到精通视频教程第一部课程中的 分析整流桥电路,电容计算小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    这个问题需要分为两个部分来回答。

    第一部分,编写程序实现上述要求:

    def merge_arrays(arr1, arr2):
        # 冒泡排序第一个数组降序排列
        for i in range(len(arr1)-1):
            for j in range(len(arr1)-i-1):
                if arr1[j] < arr1[j+1]:
                    arr1[j], arr1[j+1] = arr1[j+1], arr1[j]
    
        # 选择排序第二个数组降序排列
        for i in range(len(arr2)-1):
            max_idx = i
            for j in range(i+1, len(arr2)):
                if arr2[j] > arr2[max_idx]:
                    max_idx = j
            arr2[i], arr2[max_idx] = arr2[max_idx], arr2[i]
    
        # 合并两个数组
        merged_arr = arr1 + arr2
    
        # 去重并重新排序
        merged_arr = list(set(merged_arr))
        merged_arr.sort(reverse=True)
    
        return merged_arr
    

    这个程序首先对两个输入数组进行降序排序,然后合并两个数组并去重,最后降序重新排序。我们可以运用该函数来将两个数组合并并去重。

    第二个部分就是问题的实质,也就是随机数出现时是否会影响计算结果的准确性。这个问题的答案是不会影响。因为已经经过去重处理,不管是否出现随机数,最终的结果总是唯一的且不受干扰。因此,我们只需要保证程序合并数组后的去重处理正确即可。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^