思路:

  1. 遍历 'arr2' 数组,将 'arr2' 中的元素按照在 'arr1' 中出现的顺序依次存放到一个新的数组中,这个数组即为排好序的 'arr1' 数组。

  2. 遍历 'arr1' 数组,将未在 'arr2' 中出现过的元素按照升序插入到新数组的末尾。

  3. 将新数组中的元素复制回原来的 'arr1' 数组中。

代码实现:

void sort(int* arr1, int arr1Size, int* arr2, int arr2Size){
    int sorted[arr1Size]; // 存放排好序的 'arr1' 数组
    int index = 0; // 记录已经插入到 'sorted' 数组中的 'arr2' 中的元素数量
    for(int i = 0; i < arr2Size; i++) {
        for(int j = 0; j < arr1Size; j++) {
            if(arr1[j] == arr2[i]) {
                sorted[index++] = arr1[j];
            }
        }
    }
    // 将未在 'arr2' 中出现过的元素按照升序插入到 'sorted' 数组的末尾
    for(int i = 0; i < arr1Size; i++) {
        int j;
        for(j = 0; j < arr2Size; j++) {
            if(arr1[i] == arr2[j]) {
                break;
            }
        }
        if(j == arr2Size) { // 未在 'arr2' 中出现过
            int k;
            for(k = index; k > 0 && sorted[k-1] > arr1[i]; k--) {
                sorted[k] = sorted[k-1];
            }
            sorted[k] = arr1[i];
            index++;
        }
    }
    // 将排好序的 'arr1' 数组复制回原来的 'arr1' 数组中
    for(int i = 0; i < arr1Size; i++) {
        arr1[i] = sorted[i];
    }
}
C语言实现数组排序:保持 arr2 相对顺序,剩余元素升序排列

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

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