给你两个数组,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;
}