zoukankan      html  css  js  c++  java
  • 给字符排序-基类排序二分查找-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))
  • 相关阅读:
    Demo学习: DownloadDemo
    Demo学习: FileUpload
    Demo学习: Dialogs Anonymous Callback
    Demo学习: Cookies Demo
    Demo学习: CustomException
    Demo学习: Collapsible Panels
    Demo学习: ColumnSort
    Demo学习: ClientInfo
    Demo学习: Closable Tabs
    Demo学习: ClientEvents
  • 原文地址:https://www.cnblogs.com/caoke/p/13220958.html
Copyright © 2011-2022 走看看