如果我有字典:
mydict = {'a':1, 'b':4, 'c':9, 'd':3, 'e':1}
如何使用内置方法(如sorted?
)从最大最小的值中按值对字典进行排序答案 0 :(得分:0)
这是一个实现quicksort并使用它来对字典值进行排序的程序。这是quicksort的递归,就地实现。
def quicksort(data, left, right):
if left+1 >= right:
return
tail = left
for i in range(left, right-1):
if data[i] < data[right-1]:
data[tail], data[i] = data[i], data[tail]
tail += 1
data[right-1], data[tail] = data[tail], data[right-1]
quicksort(data, left, tail)
quicksort(data, tail+1, right)
mydict = { 'a': 1, 'b': 4, 'c': 9, 'd': 3, 'e': 1 }
values = [value for key, value in mydict.items()]
quicksort(values, 0, len(values))
print(values)
上面的代码使用范围中的最后一个元素作为数据透视表。如果你想要更好的表现并且你愿意忍受更多的代码,你可以通过取第一个,中间和最后一个值的中位数来选择枢轴元素。
def quicksort(data, left, right):
if left+1 >= right:
return
ai, bi, ci = left, (left+right)//2, right-1
a, b, c = data[ai], data[bi], data[ci]
if a < b:
if c < a:
pos = ai
elif c < b:
pos = ci
else:
pos = bi
else:
if c < b:
pos = bi
elif c < a:
pos = ci
else:
pos = ai
pivot = data[pos]
data[pos] = data[right-1]
tail = left
for i in range(left, right-1):
if data[i] < pivot:
data[tail], data[i] = data[i], data[tail]
tail += 1
data[right-1], data[tail] = data[tail], pivot
quicksort(data, left, tail)
quicksort(data, tail+1, right)
mydict = { 'a': 1, 'b': 4, 'c': 9, 'd': 3, 'e': 1 }
values = [value for key, value in mydict.items()]
quicksort(values, 0, len(values))
print(values)
答案 1 :(得分:0)
冒泡排序是最容易实现的:
def order(x, y):
if x[1] < y[1]:
return x, y
else:
return y, x
def bubble(mydict):
d_items = mydict.items()
for j in range(len(d_items) - 1):
for i in range(len(d_items) - 1):
d_items[i], d_items[i+1] = order(d_items[i], d_items[i+1])
return d_items
mydict = {'a':1, 'b':4, 'c':9, 'd':3, 'e':1}
sorted_tuples = bubble(mydict)
print sorted_tuples # prints [('a', 1), ('e', 1), ('d', 3), ('b', 4), ('c', 9)]
免责声明:由于我现在就此发表了第二条评论,似乎SO成员对冒泡排序有很强烈的感受。我个人没有任何赞成和反对,使用冒泡排序。也就是说,值得一提的是,冒泡排序是一种效率低下的排序算法,其运行时复杂度为O(n^2)
。
答案 2 :(得分:0)
一个非常简单的快速排序实现:
def quick(lst):
if len(lst) < 2:
return lst
pivot = lst[0]
l = quick([x for x in lst[1:] if x < pivot])
u = quick([x for x in lst[1:] if x >= pivot])
return l + [pivot] + u