给字符排序-基类排序二分查找-JavaScript

//比较字符基类大小 相同返回0,str1>str2 返回1,str1<str2 返回-1,
function str_compare(str1,str2){
let index=0;
let dis=0;
while (dis===0&&index<str1.length){
if(str1.charCodeAt(index)>str2.charCodeAt(index)){
dis=1
}else if(str1.charCodeAt(index)<str2.charCodeAt(index)){
dis=-1
}else{
index++;
if(index>str2.length){
dis=1;
}
}
}
if(dis===0&&index<str2.length){
dis=-1
}
return dis;
}
//用二分法查找最近的字符位置
function str_find(str,hasSortArr) {
let l=0,r=hasSortArr.length;
let index=-1;
if(hasSortArr.length>0){
const ri=str_compare(str,hasSortArr[r-1]);
if(ri===1){
return [r,-1]
}else if(ri===0){
return [r-1,r-1]
}else{
r=r-1;
}
const li=str_compare(str,hasSortArr[0]);
if(li===-1){
return [0,-1]
}else if(li===0){
return [0,0]
}else{
l=l+1;
}
while(r-l>0){
const m=(l+r)>>1;
//比较下坐标大小
const order=str_compare(str,hasSortArr[m])
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]
}
//字符排序,isOnly 是否去重
function str_sort(arr,isOnly) {
const sa=[]
for(let i=0;i<arr.length;i++){
const [n,index]=str_find(arr[i],sa);
if(!isOnly||index===-1){
sa.splice(n,0,arr[i])
}
}
return sa;
}
//字符排序
const arr=['123','是','15101175664','15101175662'];
console.log(str_sort(arr,true))
posted @ 2020-07-01 19:00  无工时代  阅读(138)  评论(0编辑  收藏  举报