C语言实现:根据数组 arr2 的顺序对数组 arr1 排序

本文介绍使用 C 语言编写的算法,通过给定的两个数组 arr1arr2,其中 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
C语言实现:根据数组 arr2 的顺序对数组 arr1 排序

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

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