带负数的Python排序列表[重复]

xu3bshqb  于 2023-03-06  发布在  Python
关注(0)|答案(3)|浏览(170)
    • 此问题在此处已有答案**:

(32个答案)
(23个答案)
8小时前关门了。
为了通过实践来学习python,我正在尝试用python来实现和测试快速排序算法。
实现本身并不困难,然而排序的结果有些令人费解:
对列表排序时
["35"、"-1"、"-2"、"-7"、"-8"、"-3"、"-4"、"20"、"-6"、"53"]
结果是
[第一、二、三、四、六、七、八、二十、三十五、五十三项]
因此,列表是按顺序排序的,而负整数是按逆序排序的。
我怀疑这可能是因为我正在对从文件中读取的int列表进行排序,而int的类型实际上不是int,而是其他类型(可能是string)。我可以做些什么来解决这个问题呢?
下面是快速排序实现的代码

#quicksort -> the conquer part of the algorithm
def quicksort(input_list, start_index, end_index):
    if start_index < end_index:
        #partition the list of integers.
        pivot = partition(input_list, start_index, end_index)
        #recursive call on both sides of the pivot, that is excluding the pivot itself
        quicksort(input_list, start_index, pivot-1)
        quicksort(input_list, pivot+1, end_index)
    return input_list

#divide part of the algorithm
def partition(input_list, start_index, end_index):
    #declare variables required for sorting
    pivot = input_list[start_index]
    left = start_index + 1
    right = end_index
    sorted = False

    while not sorted:
        #break condition so that left index is crossed with right index
        #or if the value of left crosses the pivot value
        while left <= right and input_list[left] <= pivot:
            #increment left index
            left = left + 1
        #break the loop when right and left indexes cross
        #or if the right value crosses the pivot value
        while right >= left and input_list[right] >= pivot:
            right = right-1
        if right < left:
            sorted = True
        else:
            #swap places for left value and the right value cause they are not in order
            temp = input_list[left]
            input_list[left] = input_list[right]
            input_list[right] = temp
    #swap the value at start index with what's now at the right half. Then return right for the new pivot
    temp = input_list[start_index]
    input_list[start_index] = input_list[right]
    input_list[right] = temp
    return right

任何帮助我都很感激。谢谢你们的时间和帮助。

3hvapo4f

3hvapo4f1#

你的代码运行正常,因为字符串是按字典顺序排序的(按第一个字符排序,如果第一个匹配,则按第二个排序,如果第二个匹配,则按第三个排序,等等)。如果你想按数字排序,最简单的方法是修改你的list,使它实际上是int的值:

# Possibly read from file as list of string
strlist = ['35', '-1', '-2', '-7', '-8', '-3', '-4', '20', '-6', '53']

intlist = map(int, strlist)  # list(map(int, strlist)) on Python 3

quicksort(intlist)

如果需要的话,你可以转换回str,否则,你的替代方案是实现对key函数的支持(允许你根据计算值对值排序),比如list.sort/sorted,但这可能比你现在想处理的更复杂。

quhf5bfb

quhf5bfb2#

你排序的是字符串而不是数字,所以它们是按字母顺序而不是按数字顺序排序的,int()函数可以把字符串转换成数字。

3vpjnl9f

3vpjnl9f3#

您的数字都是字符串。如果您只希望输入正整数或负整数,请在进行比较时用int()将它们括起来。

相关问题