- 此问题在此处已有答案**:
(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
任何帮助我都很感激。谢谢你们的时间和帮助。
3条答案
按热度按时间3hvapo4f1#
你的代码运行正常,因为字符串是按字典顺序排序的(按第一个字符排序,如果第一个匹配,则按第二个排序,如果第二个匹配,则按第三个排序,等等)。如果你想按数字排序,最简单的方法是修改你的
list
,使它实际上是int
的值:如果需要的话,你可以转换回
str
,否则,你的替代方案是实现对key
函数的支持(允许你根据计算值对值排序),比如list.sort
/sorted
,但这可能比你现在想处理的更复杂。quhf5bfb2#
你排序的是字符串而不是数字,所以它们是按字母顺序而不是按数字顺序排序的,
int()
函数可以把字符串转换成数字。3vpjnl9f3#
您的数字都是字符串。如果您只希望输入正整数或负整数,请在进行比较时用
int()
将它们括起来。