C 语言实现数组相对排序:按另一个数组顺序排列

问题描述:

给定两个数组 arr1arr2,其中 arr2 中的元素各不相同,且 arr2 中的每个元素都出现在 arr1 中。需要对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

思路:

  1. 遍历 arr2,将其中的元素按照在 arr1 中出现的顺序保存在一个新数组中。
  2. 对新数组进行排序。
  3. 遍历一遍 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 语言实现数组相对排序:按另一个数组顺序排列

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

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