选择排序

Selection Sorting

我有这段代码,它使用一个 txt 文件打印出国家列表。

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

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

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

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)

你不会回来mylist

def countryByPop(population):
    ...
    return mylist

你还需要清楚变量smallestlargest是什么意思。在使用之前,我没有看到 smallest 分配在哪里。

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

最后在Python中可以写这三行

    temp = myList[i]
    myList[i] = myList[smallest]
    myList[smallest] = temp

作为一个

    myList[i], myList[smallest] = myList[smallest], myList[i]

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

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

指向的国家更多的国家

此外,您的 if 语句实际上并未检查国家/地区人口。 myList 的每个元素都是一个列表。因此,您正在将列表与列表进行比较。相反,您想比较列表中的一个元素。如果列表的第三个元素存储人口,则该语句应显示为 myList[j][2] > myList[largest][2]。请注意第二组大括号来访问该人口元素。

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.

在jquery试试这个,很简单。

var Selectionsort = 函数 (A) {

        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);