递归选择排序python

时间:2010-12-03 02:53:43

标签: python

在即将到来的问题中有一个递归选择排序必须完成。

def selsort(l):
    """
    sorts l in-place.
    PRE: l is a list.
    POST: l is a sorted list with the same elements; no return value.
    """                    

l1 = list("sloppy joe's hamburger place")
vl1 = l1

print l1    # should be: """['s', 'l', 'o', 'p', 'p', 'y', ' ', 'j', 'o', 'e', "'", 's', ' ', 'h', 'a', 'm', 'b', 'u', 'r', 'g', 'e', 'r', ' ', 'p', 'l', 'a', 'c', 'e']"""

ret = selsort(l1)

print l1    # should be """[' ', ' ', ' ', "'", 'a', 'a', 'b', 'c', 'e', 'e', 'e', 'g', 'h', 'j', 'l', 'l', 'm', 'o', 'o', 'p', 'p', 'p', 'r', 'r', 's', 's', 'u', 'y']"""
print vl1   # should be """[' ', ' ', ' ', "'", 'a', 'a', 'b', 'c', 'e', 'e', 'e', 'g', 'h', 'j', 'l', 'l', 'm', 'o', 'o', 'p', 'p', 'p', 'r', 'r', 's', 's', 'u', 'y']"""

print ret   # should be "None"

我知道如何使用键→l.sort(key=str.lower)来获得此功能。但问题是我要将最大元素而不是最小元素提取到.append(...)它到递归排序的子列表。

如果我能得到任何帮助,我将非常感激。

2 个答案:

答案 0 :(得分:2)

因此。你明白这个问题吗?

让我们来看看你被要求做的事情:

  

提取最大元素,而不是最小元素,仅将.append(...)提取到递归排序的子列表。

所以,我们做了以下事情:

1)提取最大元素。你明白“提取”在这里意味着什么吗?你知道如何找到最大元素吗?

2)递归地对子列表进行排序。这里,“子列表”包含我们提取最大元素后的所有其他内容。你知道递归是如何工作的吗?您只需使用子列表再次调用sort函数,依赖它来进行排序。毕竟,你的功能的目的是排序列表,所以这应该工作,对吧? :)

3).append()排序子列表结果的最大元素。这不需要任何解释。

当然,我们需要一个递归的基本案例。我们什么时候有基础案例?当我们不能完全遵循书面的步骤。什么时候发生?好吧,为什么会发生什么?答:如果没有元素,我们就无法提取最大元素,因为那时没有要提取的最大元素。

因此,在函数的开头,我们检查是否传递了一个空列表。如果我们是,我们只返回一个空列表,因为排序一个空列表会产生一个空列表。 (你知道为什么吗?)否则,我们会完成其他步骤。

答案 1 :(得分:0)

sort方法应该做你想要的。如果你想要反过来,只需使用list.reverse()

如果你的工作是制作自己的排序方法,那就可以了。

也许尝试这样的事情:

def sort(l):
    li=l[:]                                        #to make new copy
    newlist = []                                   #sorted list will be stored here
    while len(li) != 0:                            #while there is stuff to be sorted
        bestindex = -1                             #the index of the highest element
        bestchar = -1                              #the ord value of the highest character
        bestcharrep = -1                           #a string representation of the best character
        i = 0
        for v in li:
            if ord(v) < bestchar or bestchar == -1:#check if string is lower than old best
                bestindex = i                      #Update best records
                bestchar = ord(v)
                bestcharrep = v
            i += 1
        del li[bestindex]                          #delete retrieved element from list
        newlist.append(bestcharrep)                #add element to new list
    return newlist                                 #return the sorted list