package org.example;
public class Main {
public static void main(String[] args) {
relativeSortArray(new int[]{2,21,43,38,0,42,33,7,24,13,12,27,12,24,5,23,29,48,30,31}, new int[]{2,42,38,0,43,21});
}
public static int[] relativeSortArray(int[] arr1, int[] arr2) {
int[] fq = new int[1000 + 1];
for (int i = 0; i < arr1.length; i++) {
fq[arr1[i]]++;
}
int idx = 0;
for (int i = 0; i < arr2.length; i++) {
while (fq[arr2[i]] > 0) {
arr1[idx++] = arr2[i];
fq[arr2[i]]--;
}
}
for (int i = 0; i < 1001; i++) {
while (fq[i] > 0) {
arr1[idx++] = i;
fq[i]--;
}
}
return arr1;
}
}
another example
package org.example;
public class Main {
public static void main(String[] args) {
sortString("aaaabbbbcccc");
}
public static String sortString(String s) {
int[] fq = new int[131];
for (int i = 0; i < s.length(); i++) {
fq[(int) s.charAt(i)]++;
}
StringBuilder sb = new StringBuilder();
while (true) {
boolean needBreak = true;
for (int i = 65; i < 130; i++) {
if (fq[i] > 0) {
sb.append((char) i);
fq[i]--;
needBreak = false;
}
}
for (int i = 130; i >= 65; i--) {
if (fq[i] > 0) {
sb.append((char) i);
fq[i]--;
needBreak = false;
}
}
if (needBreak) {
break;
}
}
return sb.toString();
}
}