如何在Python中对多个条件进行快速排序?

时间:2018-07-02 00:47:38

标签: python quicksort

现在,我的代码如下:

select * from table(apex_string.split('THIS:IS:GREAT',':'));

但这只是按UF排序,这是我数组中的许多键之一。我将如何包含另一个键,以便它与UF排序相同?

1 个答案:

答案 0 :(得分:0)

通过项的任意转换(例如,与字典中特定键对应的值或项的属性)进行排序的经典方法是Decorate-Sort-Undecorate模式。

其工作方式是,首先用一个元组替换它们来“装饰”列表中的项目,该元组以要排序的每个值开头(最高有效位在前),然后以原始值结束。 / p>

然后您像往常一样对列表进行排序,直接比较项目(就像在对数字列表进行排序一样)。

最后,对转换后的值列表进行排序后,您可以反转应用于项目的转换,丢弃不再需要的元组和值,而只保留原始项目。

这是将其添加到quickSort函数中的方法。在这里,我假设uf是一个包含您关心的所有键的序列:

def quickSort(lista,inicio,fim):
    for i, value in enumerate(lista):                        # decorate step
        lista[i] = tuple(value[x] for x in uf) + (i, lista)  # index i used as final tiebreaker

    pilha = []
    pilha.append((inicio,fim))

    while pilha:      
        pos = pilha.pop()
        fim, inicio = pos[1], pos[0]
        piv = partition(lista,inicio,fim)

        if piv-1 > inicio:
            pilha.append((inicio,piv-1))

        if piv+1 < fim:
            pilha.append((piv+1,fim))

    for i, value in enumerate(lista):                        # undecorate step
        lista[i] = value[-1]

您将需要更改partition函数以直接比较项目,而不是通过uf进行索引。

稍微复杂一点的方法将删除全局查找的uf键序列,而使用key函数。该函数可以执行任何所需的操作,只要它返回一个可比较的值即可。装饰步骤将变为lista[i] = (key(value), i, value)。这就是Python的内置排序代码的工作方式(尽管它不使用quicksort)。