【问题标题】:Tkinter Treeview QuicksortTkinter 树视图快速排序
【发布时间】:2021-03-29 04:07:15
【问题描述】:

我在this sort 的启发下实现了这个树视图快速排序算法。

我遇到了一个问题,即具有相同第一位数字的多个数字值相互叠加,我在下面显示了一个屏幕截图。

我想让它正确排序 (1,2,3,4,5,6,7,8,9,11)

我知道并且之前使用过here 解决方案,但是我不知道如何在我的快速排序版本中实施此修复。

这是我的代码:

def sort_upon_press(self, c):
    self.arr = [(self.tree.set(k, c), k) for k in self.tree.get_children('')]
    self.n = len(self.arr)
    self.quickSort(self.tree, c, self.arr, 0, self.n-1, False)

def partition(self, arr,low, high):
    i = (low-1)
    pivot = arr[high]
    print(pivot)
 
    for j in range(low, high):
        if arr[j] <= pivot:
            i = i+1
            arr[i], arr[j] = arr[j], arr[i]
 
    arr[i+1], arr[high] = arr[high], arr[i+1]
    return (i+1)
 
def quickSort(self, tv, col, arr, low, high, reverse):
    if len(arr) == 1:
        return arr
    if low < high:
        pi = self.partition(arr, low, high)
 
        self.quickSort(tv, col, arr, low, pi-1, reverse=reverse)
        self.quickSort(tv, col, arr, pi+1, high, reverse=reverse)

    for index, (val, k) in enumerate(arr):
        tv.move(k, '', index)

    tv.heading(col, command=lambda: \
        self.quickSort(tv, col, arr, low, high, not reverse))
    if reverse == True:
        arr_reverse = arr[::-1]
        for index, (val, k) in enumerate(arr_reverse):
            tv.move(k, '', index)

【问题讨论】:

  • 您的值被排序为字符串而不是数字。列中总是有整数还是也可以是字符串?
  • @j_4321 在此列中,只有整数。
  • 然后在排序前将值转换为int
  • @j_4321 什么值?
  • 我传入行的树 ID 并通过附加/分离值应该按顺序排列的位置对其进行排序。树 ID 显示为 I001I002 之类的值,但值 11 显示为树 ID:I00A,这让我的系统崩溃了。我必须确保排序将值视为整数,但我不知道该怎么做。

标签: python sorting tkinter


【解决方案1】:

项目未按预期顺序排列的原因是它们按字符串而不是整数排序。这可以通过将项目的值转换为sort_upon_press() 中的 int 来解决:

def sort_upon_press(self, c):
    self.arr = [(int(self.tree.set(k, c)), k) for k in self.tree.get_children('')]
    self.n = len(self.arr)
    self.quickSort(self.tree, c, self.arr, 0, self.n-1, False)

【讨论】: