1122 数组的相对排序给你两个数组arr1 和 arr2arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中。使用c语言不使用函数功能对 arr1 中的元素进行排序使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
思路:
首先,我们需要对 arr1 中的元素进行计数排序,以满足相对顺序的要求。
其次,我们需要记录 arr1 中未在 arr2 中出现过的元素,并将其按照升序放在 arr1 的末尾。可以使用双指针来实现。
具体步骤如下:
-
首先,我们需要遍历 arr1 数组,统计每个元素的出现次数,使用计数排序进行排序。
-
然后,我们需要遍历 arr2 数组,将其中的元素按照它们在 arr1 数组中出现的顺序依次放入 arr1 数组中。
-
接下来,我们需要遍历 arr1 数组,找到未在 arr2 中出现过的元素,并将它们按照升序放在 arr1 的末尾。
-
最后,我们可以输出排好序后的 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 著作权归作者所有。请勿转载和采集!