首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复此选择排序逻辑错误?

如何修复此选择排序逻辑错误?
EN

Stack Overflow用户
提问于 2019-04-20 10:24:49
回答 2查看 64关注 0票数 0

我正在尝试实现选择排序,但它并不像算法中所说的那样,我是不是用赋值操作符做错了什么?

代码语言:javascript
复制
def selection_sort(list_1):
    for i in range(len(list_1)):
        val = min(list_1[i:])
        list_1[i],list_1[list_1.index(val)] =list_1[list_1.index(val)], list_1[i]
    print (list_1)

print(selection_sort([3,3,4,3,465,45,346,5,456,545,345345,345]))`
EN

回答 2

Stack Overflow用户

发布于 2019-04-20 10:38:57

这个问题是因为当您调用index函数时,数组中有多个数字具有相同的值。因此,它选择它在整个数组中看到的第一个匹配的数字,它可能是一个已经排序的值(在当前i之前)。

这是一种更好的方法:

代码语言:javascript
复制
def selection_sort(list_1):
    for i in range(len(list_1)):
        min_val = list_1[i]
        min_i = i
        for j in range(i + 1, len(list_1)):
            if list_1[j] < min_val:
                min_val = list_1[j]
                min_i = j

        list_1[i], list_1[min_i] = list_1[min_i], list_1[i]
    print (list_1)

selection_sort([3,3,4,3,465,45,346,5,456,545,345345,345])

新的代码块查找存储在min_i中的i之后的最小值的索引。

票数 1
EN

Stack Overflow用户

发布于 2019-04-20 11:49:57

我发现问题是由list_1.index( val )引起的,因为每次它都会在列表的开头搜索val,为了解决这个问题,使用第二个参数就足够了(val,list_1.index)

代码语言:javascript
复制
def selection_sort(list_1):
    for i in range(len(list_1)):
        val = min(list_1[i:])
        temp = list_1[i]
        list_1[list_1.index(val, i)], list_1[i] = temp, val
    print (list_1)

selection_sort([3,3,4,3,465,45,346,5,456,346,456,545,345345,345])

结果是3,3,3,4,5,45,345,346,346,456,456,465,545,345345

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55769724

复制
相关文章

相似问题

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