【算法优化】一个将汉字按首字母排序的方法优化

pySort = (arr: any) => {
    if (!String.prototype.localeCompare) return null
    let letters = 'ABCDEFGHJKLMNOPQRSTWXYZ'.split('')
    let zh = '阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀'.split('')
    let segs: any = []
    letters.forEach((item, i) => {
        let temp: any = { letter: item, data: [] }
        arr.forEach((item: any) => {
            if (
                item.localeCompare(zh[i]) >= 0 &&
                item.localeCompare(zh[i + 1]) < 0
            ) {
                temp.data.push(item)
            }
        })
        if (temp.data.length) {
            temp.data.sort(function(a: any, b: any) {
                return a.localeCompare(b, 'zh')
            })
            segs.push(temp)
        }
    })
    return segs
}

时间复杂度太高了,有大佬能优化一下吗

阅读 2.1k
2 个回答

可以先排序,再切分即可

const pySort = arr => {
  if (!String.prototype.localeCompare) return null
  arr.sort((a, b) => a.localeCompare(b, 'zh'))
  const letters = [...'ABCDEFGHJKLMNOPQRSTWXYZ']
  const zh = [...'阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀']
  const groups = []
  let i = 0
  letters.forEach((letter, j) => {
    const st = i
    while (i < arr.length && arr[i].localeCompare(zh[j + 1], 'zh') < 0) ++i
    if (st < i) groups.push({ letter, data: arr.slice(st, i) })
  })
  return groups
}

性能瓶颈就是排序

  1. String.prototype.localeCompare 是什么
  2. 存在Number.prototype.localeCompare,Array.prototype.localeCompare,Object.prototype.localeCompare这几个方法吗
  3. 你文字要的是排序,而代码实现的是分组,你究竟要啥?

const localeCompare =String.prototype.localeCompare

const pySort = (arr: string[]) => arr.sort(localeCompare)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题