思路:

首先,我们需要对 arr1 中的元素进行计数排序,以满足相对顺序的要求。

其次,我们需要记录 arr1 中未在 arr2 中出现过的元素,并将其按照升序放在 arr1 的末尾。可以使用双指针来实现。

具体步骤如下:

  1. 首先,我们需要遍历 arr1 数组,统计每个元素的出现次数,使用计数排序进行排序。

  2. 然后,我们需要遍历 arr2 数组,将其中的元素按照它们在 arr1 数组中出现的顺序依次放入 arr1 数组中。

  3. 接下来,我们需要遍历 arr1 数组,找到未在 arr2 中出现过的元素,并将它们按照升序放在 arr1 的末尾。

  4. 最后,我们可以输出排好序后的 arr1 数组。

代码实现:

void relativeSortArray(int* arr1, int arr1Size, int* arr2, int arr2Size){
    // 计数排序
    int count[1001] = {0};
    for (int i = 0; i < arr1Size; i++) {
        count[arr1[i]]++;
    }
    int index = 0;
    for (int i = 0; i < arr2Size; i++) {
        while (count[arr2[i]] > 0) {
            arr1[index++] = arr2[i];
            count[arr2[i]]--;
        }
    }
    for (int i = 0; i <= 1000; i++) {
        while (count[i] > 0) {
            arr1[index++] = i;
            count[i]--;
        }
    }
    // 双指针排序
    int left = 0, right = arr1Size - 1;
    while (left < right) {
        while (left < arr1Size && count[arr1[left]] > 0) {
            left++;
        }
        while (right >= 0 && count[arr1[right]] == 0) {
            right--;
        }
        if (left < right) {
            int temp = arr1[left];
            arr1[left] = arr1[right];
            arr1[right] = temp;
        }
    }
}
``

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

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