package leetcode.sort;
/**
* @Description: 给你两个数组,arr1 和 arr2,
arr2 中的元素各不相同
arr2 中的每个元素都出现在 arr1 中
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
示例:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]
提示:
arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2 中的元素 arr2[i] 各不相同
arr2 中的每个元素 arr2[i] 都出现在 arr1 中
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/relative-sort-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
* @Param:
* @return:
* @Author: lvhong
* @Date:
* @E-mail lvhong282@163.com
*/
public class lab1122 {
// /**
// * @Description: 变异的计数排序
// * 时间复杂度:O(n)
// * 空间复杂度:O(n)
// * @Param:
// * @return:
// * @Author: lvhong
// * @Date:
// * @E-mail lvhong282@163.com
// */
// public int[] relativeSortArray(int[] arr1, int[] arr2) {
// int[] tmp = new int[1001]; //用于统计数组一中个元素的个数
// int[] out = new int[arr1.length]; //数组一的排序输出
// int pos=0;
// //统计数组一内个元素的数量
// for (int i=0;i<arr1.length
// ;i++){
// tmp[arr1[i]]++;
// }
// //循环将数组二内存在的数按顺序排列
// for(int i = 0;i<arr2.length;i++){
// while(tmp[arr2[i]]>0){
// out[pos++]=arr2[i];
// tmp[arr2[i]]--;
// }
// }
//
// //第二次循环导入数组二内没有的元素
// for(int i=0;i<1001;i++){
// while(tmp[i]>0){
// out[pos++]=i;
// tmp[i]--;
// }
// }
// return out;
// }
/**
* @Description: 变异的桶排序(可优化,上面的利用了题目的0<n<=1000,但实际计算时应该是通过计算最大值和最小值的差来尽可能减少内存的消耗
* 时间复杂度:O(n)
* 空间复杂度:O(n)
* @Param:
* @return:
* @Author: lvhong
* @Date:
* @E-mail lvhong282@163.com
*/
public int[] relativeSortArray(int[] arr1, int[] arr2) {
//加一个计算中间数组的优化
int min = arr1[0], max = arr1[0];
for(int i = 1; i < arr1.length; i++) {
if(arr1[i] < min) {
min = arr1[i];
}
if(arr1[i] > max) {
max = arr1[i];
}
}
int len = max-min+1;
int[] tmp = new int[len]; //用于统计数组一中个元素的个数
int[] out = new int[arr1.length]; //数组一的排序输出
int pos=0;
//统计数组一内个元素的数量
for (int i=0;i<arr1.length;i++){
tmp[arr1[i]-min]++;
}
//循环将数组二内存在的数按顺序排列
for(int i = 0;i<arr2.length;i++){
while(tmp[arr2[i]-min]>0){
out[pos++]=arr2[i];
tmp[arr2[i]-min]--;
}
}
//第二次循环导入数组二内没有的元素
for(int i=0;i<len;i++){
while(tmp[i]>0){
out[pos++]=i+min;
tmp[i]--;
}
}
return out;
}
}