思路:

首先遍历 arr2,将其中的元素按照在 arr1 中出现的顺序保存在一个新数组中。然后对新数组进行排序,最后再遍历一遍 arr1,将未出现在 arr2 中的元素按照升序放在末尾。

代码实现:

#include <stdio.h>

void relativeSortArray(int* arr1, int arr1Size, int* arr2, int arr2Size, int* result, int* resultSize){
    int count[1001] = {0};   // 统计 arr1 中每个元素出现的次数
    for(int i = 0; i < arr1Size; i++){
        count[arr1[i]]++;
    }
    int index = 0;
    for(int i = 0; i < arr2Size; i++){  // 遍历 arr2,将其中的元素按照在 arr1 中出现的顺序保存在一个新数组中
        for(int j = 0; j < count[arr2[i]]; j++){
            result[index++] = arr2[i];
        }
        count[arr2[i]] = 0;  // 将 arr1 中已经出现的元素出现次数清零
    }
    for(int i = 0; i <= 1000; i++){  // 对未出现在 arr2 中的元素按照升序放在末尾
        for(int j = 0; j < count[i]; j++){
            result[index++] = i;
        }
    }
    *resultSize = index;   // 修改 result 的大小
}

int main(){
    int arr1[] = {2,3,1,3,2,4,6,7,9,2,19};
    int arr1Size = sizeof(arr1) / sizeof(int);
    int arr2[] = {2,1,4,3,9,6};
    int arr2Size = sizeof(arr2) / sizeof(int);
    int result[arr1Size];
    int resultSize = 0;
    relativeSortArray(arr1, arr1Size, arr2, arr2Size, result, &resultSize);
    for(int i = 0; i < resultSize; i++){
        printf("%d ", result[i]);
    }
    return 0;
}

输出结果为:

2 2 2 1 4 3 3 9 6 7 19
``
用c语言给你两个数组arr1 和 arr2arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中。对 arr1 中的元素进行排序使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

原文地址: https://www.cveoy.top/t/topic/e9bp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录