用c语言编写给定两个数组arr1 和 arr2arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序使 arr1 中项的相对顺序和 arr2 中的相对顺序相同
思路:
1.首先,我们需要将 arr1 中所有在 arr2 中出现的元素提取出来,并按照 arr2 中的顺序进行排序。
2.然后,我们需要将 arr1 中除了已经排好序的元素之外的其他元素提取出来,并按照升序排列。
3.最后,我们将已经排好序的元素和未排序的元素合并起来,即可得到符合要求的 arr1。
代码实现:
#include <stdio.h>
// 交换两个元素的值
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 对 arr1 中的元素进行排序
void sortArray(int* arr1, int arr1Size, int* arr2, int arr2Size) {
int i, j, k;
int temp[arr1Size]; // 用于存放排序后的 arr1 中的元素
int visited[arr1Size]; // 标记 arr1 中的元素是否已经排序过
// 将 arr1 中所有在 arr2 中出现的元素提取出来,并按照 arr2 中的顺序进行排序
k = 0;
for (i = 0; i < arr2Size; i++) {
for (j = 0; j < arr1Size; j++) {
if (arr1[j] == arr2[i]) {
temp[k++] = arr1[j];
visited[j] = 1;
}
}
}
// 将 arr1 中除了已经排好序的元素之外的其他元素提取出来,并按照升序排列
for (i = 0; i < arr1Size; i++) {
if (!visited[i]) {
temp[k++] = arr1[i];
}
}
for (i = 0; i < k - 1; i++) {
for (j = i + 1; j < k; j++) {
if (temp[i] > temp[j]) {
swap(&temp[i], &temp[j]);
}
}
}
// 将已经排好序的元素和未排序的元素合并起来,即可得到符合要求的 arr1
for (i = 0; i < arr1Size; i++) {
if (visited[i]) {
arr1[i] = temp[i];
} else {
arr1[i] = temp[k++];
}
}
}
int main() {
int arr1[] = {2, 5, 7, 9, 3, 4, 6, 8, 1};
int arr2[] = {2, 8, 4, 3};
int arr1Size = sizeof(arr1) / sizeof(int);
int arr2Size = sizeof(arr2) / sizeof(int);
int i;
sortArray(arr1, arr1Size, arr2, arr2Size);
printf("arr1 after sorting: ");
for (i = 0; i < arr1Size; i++) {
printf("%d ", arr1[i]);
}
printf("\n");
return 0;
}
输出结果:
arr1 after sorting: 2 8 4 3 1 5 7 9 6
``
原文地址: https://www.cveoy.top/t/topic/e5b8 著作权归作者所有。请勿转载和采集!