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))
但是,如果没有图书馆,人们如何有效地做到这一点呢?我一直在想一个解决办法,我在想
但这似乎效率极低。有人能提供更好的实现吗?一个解决方案是制作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的输入。我刚刚尝试了这个实现,但它不能保持稳定的顺序。我刚刚尝试了这个实现,但它不能保持稳定的顺序