Python 3.x 不使用排序库的稳定排序-Python

Python 3.x 不使用排序库的稳定排序-Python,python-3.x,sorting,Python 3.x,Sorting,我想按单词长度对单词列表进行排序,但保持相同长度单词的原始顺序(稳定排序) 例如: words = ['dog', 'cat', 'hello', 'girl', 'py', 'book'] 应该成为 words = ['py', 'dog', 'cat', 'girl', 'book', 'hello'] 我知道使用python的sorted函数很容易做到这一点,它是稳定的: sorted(words, key = lambda l:len(l)) 但是,如果没有图书馆,人们如何有效地做

我想按单词长度对单词列表进行排序,但保持相同长度单词的原始顺序(稳定排序)

例如:

words = ['dog', 'cat', 'hello', 'girl', 'py', 'book']
应该成为

words = ['py', 'dog', 'cat', 'girl', 'book', 'hello']
我知道使用python的sorted函数很容易做到这一点,它是稳定的:

sorted(words, key = lambda l:len(l))
但是,如果没有图书馆,人们如何有效地做到这一点呢?我一直在想一个解决办法,我在想

  • 创建一个包含单词中每个单词的索引(键)和长度(值)的dict
  • 也许可以使用计数器来跟踪每个长度单词有多少个实例(例如,看起来像计数器({3:2,5:1,4:2,2:1}))
  • 在计数器中查找单词的最小长度(在我的ex中为2),并在该长度出现的次数内继续这样做
  • 步骤3,但进入计数器中的下一个最小值

  • 但这似乎效率极低。有人能提供更好的实现吗?

    一个解决方案是制作dictionary
    bucket
    ,其中键是单词的长度(整数),值是存储相同长度单词的列表。您可以在线性时间内构造此dict

    然后将字典从
    0
    遍历到
    max_bucket
    ,其中
    max_bucket
    是观察到的单词的最大长度:

    words = ['dog', 'cat', 'hello', 'girl', 'py', 'book']
    
    buckets = {}
    max_bucket = -1
    for w in words:
        buckets.setdefault(len(w), []).append(w)
        if len(w) > max_bucket:
            max_bucket = len(w)
    
    out = [w for i in range(max_bucket+1) for w in buckets.get(i, [])]
    print(out)
    
    印刷品:

    ['py', 'dog', 'cat', 'girl', 'book', 'hello']
    

    一种解决方案是制作dictionary
    bucket
    ,其中键是单词的长度(整数),值是存储相同长度单词的列表。您可以在线性时间内构造此dict

    然后将字典从
    0
    遍历到
    max_bucket
    ,其中
    max_bucket
    是观察到的单词的最大长度:

    words = ['dog', 'cat', 'hello', 'girl', 'py', 'book']
    
    buckets = {}
    max_bucket = -1
    for w in words:
        buckets.setdefault(len(w), []).append(w)
        if len(w) > max_bucket:
            max_bucket = len(w)
    
    out = [w for i in range(max_bucket+1) for w in buckets.get(i, [])]
    print(out)
    
    印刷品:

    ['py', 'dog', 'cat', 'girl', 'book', 'hello']
    

    您只需使用nomral
    气泡排序
    技术即可

    算法

    • 从0到
      len(word)-1的循环
    • i+1
      len(words)
    • 如果
      words[i]>words[j]
    • 进行交换,单词[i]=单词[j]
    输出

    ['py', 'cat', 'dog', 'girl', 'book', 'hello'] 
    

    这就解决了
    O(N*N)
    的时间复杂性问题。太贵了。但您可以将其用于长度为
    10^3

    的输入,您可以使用nomral
    气泡排序技术来实现这一点

    算法

    • 从0到
      len(word)-1的循环
    • i+1
      len(words)
    • 如果
      words[i]>words[j]
    • 进行交换,单词[i]=单词[j]
    输出

    ['py', 'cat', 'dog', 'girl', 'book', 'hello'] 
    

    这就解决了
    O(N*N)
    的时间复杂性问题。太贵了。但您可以将其用于长度为10^3的输入。我刚刚尝试了这个实现,但它不能保持稳定的顺序。我刚刚尝试了这个实现,但它不能保持稳定的顺序