Optimal: counting sort
Time O(n + m + range) Space O(range)count[v] for every value. Write each arr2 value count[v] times (then zero it), then walk v = 0..1000 writing leftovers.
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int[] count = new int[1001];
for (int v : arr1) count[v]++;
int k = 0;
for (int v : arr2) while (count[v]-- > 0) arr1[k++] = v;
for (int v = 0; v <= 1000; v++) while (count[v]-- > 0) arr1[k++] = v;
return arr1;
}
}Verdict: Linear.