首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择排序

选择排序
EN

Stack Overflow用户
提问于 2015-11-16 22:16:38
回答 3查看 254关注 0票数 0

我有这样的代码,它接受一个txt文件,输出一个国家列表。

代码语言:javascript
复制
def readCountries(filename):
    result=[]
    lines=open(filename)

    for line in lines:
        result.append(line.strip('\n').split(',\t'))
    for sublist in result:
        sublist[1]=float(sublist[1])
        sublist[2]=int(sublist[2])

    return result

我正在尝试创建一个选择排序,按照人口降序对列表进行排序,并打印信息。

这是我的代码,我做错了什么?

代码语言:javascript
复制
def countryByPop(population):
    myList=readCountries('countries.txt')

    for i in range(0,len(myList)):
        largest = i
        for j in range(i,len(myList)):
            if myList[j]<myList[smallest]:
                smallest = j
        temp = myList[i]
        myList[i] = myList[smallest]
        myList[smallest] = temp

    if population range(0,len(myList))
        return temp
    else:
        print "Invalid Parameter: %s" %(population)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-16 22:44:07

首先,定义变量largest并不再使用它。然后使用未定义的变量smallest。我假设您打算将smallest的所有实例更改为largest,而largest将成为列表中指向人口最多的国家的索引。您应该将smallest的所有实例更改为largest

要按降序排序,您需要在外层for循环的每次迭代中找到最大的项,然后将其移动到myList[i]。但是,通过测试myList[j] < myList[smallest],您最终会将最小的元素移到列表的开头。您应该将其更改为>而不是<。这样,内部for循环就可以找到人口比largest所指的国家更多的国家。

另外,您的if语句实际上并不是在检查国家人口。myList的每个元素都是一个列表。所以你把一个列表和一个列表进行比较。相反,您希望比较列表中的一个元素。如果列表的第三个元素存储人口,那么语句应该读取myList[j][2] > myList[largest][2]。注意第二组大括号来访问这个居群元素。

代码语言:javascript
复制
def countryByPop(population):
    myList=readCountries('countries.txt')

    for i in range(0,len(myList)):
        largest = i
        for j in range(i, len(myList)):
            if myList[j][2] > myList[largest][2]:
                largest = j
        temp = myList[i]
        myList[i] = myList[largest]
        myList[largest] = temp

    if population < len(myList):
        return myList[population-1]
    else:
        print "Invalid Parameter: %s" % (population)

如果population参数用于检索第n个人口最多的国家,那么您可以通过myList[population-1]检索该项。在if语句中使用range()是不必要的。代码反映了这一变化。您应该使用比population更好的名称来澄清意图,例如country_rank

票数 0
EN

Stack Overflow用户

发布于 2015-11-16 22:23:16

您不会返回mylist

代码语言:javascript
复制
def countryByPop(population):
    ...
    return mylist

您还需要弄清楚变量smallestlargest的含义。在使用smallest之前,我不知道它是在哪里分配的。

假设国家名称是记录中的第一个元素,则需要比较myList[j][1] < myList[smallest][1],例如,如果人口是第二个元素

最后,在Python中,您可以编写以下三行

代码语言:javascript
复制
    temp = myList[i]
    myList[i] = myList[smallest]
    myList[smallest] = temp

作为一个整体

代码语言:javascript
复制
    myList[i], myList[smallest] = myList[smallest], myList[i]
票数 0
EN

Stack Overflow用户

发布于 2017-01-15 09:16:46

在jquery中试试这个,非常简单。

变量选择排序=函数(A) {

代码语言:javascript
复制
        for (var i = 0; i < A.length; i++) {
            var imin = i;
                for (var j = i + 1; j <= A.length; j++) {
                    if (A[j] < A[imin]) 
                        imin = j;
                }
                var tmp = A[i];
                A[i] = A[imin];
                A[imin] = tmp;
        }
        return A;
    };
    var A = [10, 20, 30, 40, 50, 60, 70, 80];
    var Aftersorted = Selectionsort(A);
    console.log(Aftersorted);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33745660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档