//二分查找法,返回最接近的位置和实际位置
function binary_find(id,hasSortArr){
let l=0,r=hasSortArr.length;
let index=-1;
while(r-l>0){
const m=(l+r)>>1;
const mid=hasSortArr[m]
//比较下坐标大小
const order=id>mid?1:(id<mid?-1:0)
if(order===1){
l=Math.max(l+1,m)
}else if(order===-1){
r=Math.min(r-1,m)
}else{
l=r=m;
index=m;
}
}
return [(l+r)>>1,index]
}
//二分法去重排序
function binary_sort(str) {
const sa=[]
for(let i=0;i<str.length;i++){
const [n,index]=binary_find(str[i],sa);
if(index===-1){
sa.splice(n,0,str[i])
}
}
return sa;
}
let str='safsdfafd12你3123123';
console.log(binary_sort(str));
/*[
'1', '2', '3',
'a', 'd', 'f',
's', '你'
]*/