C语言实现:根据数组 arr2 的顺序对数组 arr1 排序
C语言实现:根据数组 arr2 的顺序对数组 arr1 排序
本文介绍使用 C 语言编写的算法,通过给定的两个数组 arr1 和 arr2,其中 arr2 中的元素各不相同且都出现在 arr1 中,对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。
思路
-
首先,我们需要将
arr1中所有在arr2中出现的元素提取出来,并按照arr2中的顺序进行排序。 -
然后,我们需要将
arr1中除了已经排好序的元素之外的其他元素提取出来,并按照升序排列。 -
最后,我们将已经排好序的元素和未排序的元素合并起来,即可得到符合要求的
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/n1RV 著作权归作者所有。请勿转载和采集!