class Solution {
public boolean gcdSort(int[] nums) {
int n = nums.length;//nums中数的个数
int[] sort = nums.clone();
Arrays.sort(sort);
//int maxNum = Arrays.stream(nums).max().getAsInt();//nums数组中最大值
UnionFind uf = new UnionFind(sort[n-1]+1);
for(int i = 0;i < n;i++){
int cur = nums[i];
int num = cur;
for(int j=2;j<=num;j++){
if(num % j == 0){
uf.union(cur,j);
num /= j;
}
}
}
for(int i =0;i<n;i++){
if(sort[i] == nums[i] || uf.find(sort[i]) == uf.find(nums[i]))
continue;
else
return false;
}
return true;
}
public class UnionFind{
int[] parent;
int[] rank;
public UnionFind(int n){
parent = new int[n];
rank = new int[n];
for(int i = 0;i < n;i++){
parent[i] = i;
rank[i] = 1;
}
}
public int find(int x){
if(parent[x] != x){
parent[x] = find(parent[x]);
}
return parent[x];
}
public void union(int x,int y){
int rootX = find(x);
int rootY = find(y);
if(rootX == rootY)
return ;
if(rank[rootX] == rank[rootY]){
parent[rootX] = rootY;
rank[rootY] += 1;
}
else if(rank[rootX] > rank[rootY]){
parent[rootY] = rootX;
}
else{
parent[rootX] = rootY;
}
}
}
}