在附加切片时排序?

fab*_*ous 2 arrays sorting go

我有一个[]byte我需要按升序排序的东西.

我得到一个带有项目的对象,然后迭代数组以创建返回的对象:

// unfortunately, for some obscure reason I can't change the data types of the caller and the object from the function call are different, although both are []byte underneath (...)

type ID []byte
// in another package:
type ByteInterface []byte


func (c *Store) GetAll() ByteInterface {
  returnObj := make([]ByteInterface,0)
  obj, err := GetData()
  // err handling
  for _, b := range obj.IDs {
     returnObj = append(returnObj, ByteInterface(b))
  }
  return returnObj
}
Run Code Online (Sandbox Code Playgroud)

所以我问自己是否可以这样做,append以便立即returnObj排序,或者我是否需要obj.ByteData预先排序(或后续排序returnOjb).

kos*_*tix 5

在每次迭代中,执行以下操作:

  1. 增长目标切片(可能重新分配):

    numElems := len(returnObj)
    returnObj = append(returnObj, make([]byte, len(obj))...)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用标准方法进行插入,通过查找放置源切片中每个字节的位置来逐个对目标进行排序:

    for _, b := range obj {
      i := sort.Search(numElems, func (i int) bool {
        return returnObj[i] >= b
      }
      if i < numElems {
        copy(returnObj[i+1:], returnObj[i:])
      }
      returnObj[i] = b
      numElems++
    }
    
    Run Code Online (Sandbox Code Playgroud)

    (copy应该通过少量复制来优化呼叫,但这仍然是读者的练习.)

  • @faboolous真正的问题是额外的代码复杂性是否值得获得可能获得的任何收益.或者如果你愿意接受线下的一些随机dev可能(即)决定将现有切片的前两个元素切换为追加排序,这打破了排序切片总是来的假设如果附加非空切片,则跳出另一端. (2认同)