数组的相对排序

给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。

对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

这题其实还是有点难度的,首先我们得遍历arr2的数组元素,并且将arr1的元素按照arr2里的元素顺序排列,还要将没有出现的数字按从小到大排列,这样一想就感觉头都大了。不要慌,我们慢慢来就行,首先我们先将这分成两部分,第一部分先将arr1的元素按arr2的元素排列,既然要将arr2的元素放在前面,我们就不得不创建内外循环,外循环是遍历arr2,内循环是遍历arr1,这样就可以将arr1中的元素放在前面,废话不多说,看代码更直观

for (i = 0; i < arr2Size; i++)
    {
        for (j = 0; j < arr1Size; j++)
        {
            if (arr1[j] == arr2[i])//将arr2的元素按arr2的元素顺序放在前面
            {
                int tmp = arr1[j];
                arr1[j] = arr1[n];//n从开始
                arr1[n] = tmp;
                n++;//记录有多少个arr2的元素
            }
        }
        j = n;
    }

弄好后,因为有前面知道了arr1中有多少arr2的元素并将它们放在最前面。所以我们直接从arr1+n开始快排,里面的元素是arr1Size-n个,这样我们将完成了,直接返回arr1就行。

int cump(const void*a, const void*b)

{

    return *(int*)a - *(int*)b;

}

int* relativeSortArray(int* arr1, int arr1Size, int* arr2, int arr2Size, int* returnSize)

{

    *returnSize = arr1Size;

    int i = 0;

    int j = 0;

    int n = 0;

    for (i = 0; i < arr2Size; i++)

    {

        for (j = 0; j < arr1Size; j++)

        {

            if (arr1[j] == arr2[i])

            {

                int tmp = arr1[j];

                arr1[j] = arr1[n];

                arr1[n] = tmp;

                n++;

            }

        }

        j = n;

    }

    qsort(arr1 + n, (arr1Size - n), sizeof(int), cump);

    return arr1;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值