【问题标题】:Python Selection sort with nested while loop带有嵌套while循环的Python选择排序
【发布时间】:2018-07-14 04:27:06
【问题描述】:

我知道我可以使用带有嵌套 for 循环的选择排序对数组进行排序,如下所示:

def selection_sort(arr):
 for k in range(len(arr)):
      cur = k
      for i in range(cur, len(arr)):
           if arr[cur] > arr[i]:
                cur = i
           temp = arr[cur]
           arr[cur] = arr[k]
           arr[k] = temp

但这可以通过嵌套在 for 循环中的 while 循环来完成吗?我很好奇,因为我看到它提到这个选择排序函数的语法可能类似于插入排序函数,例如下面的那个:

def insertion_sort(arr):
 for k in range(1, len(arr)):
      cur = arr[k]
      j = k
      while j > 0 and arr[j-1] > cur:
           arr[j] = arr[j-1]
           j = j - 1
      arr[j] = cur

我是否忽略了一些简单的事情?自从我使用 python 以来已经有一段时间了,但是使用 for 循环而不是 while 循环似乎更简单,不是吗?不过,我对如何做到这一点感到困惑。

【问题讨论】:

  • 任何可以用for 循环完成的事情,也可以用while 循环完成(这是一个定理)。
  • 您的 for 循环只是遍历索引范围,这可以通过 while 循环非常简单地完成:i = 0; while i < len(arr): <do some stuff> i += 1
  • 但是你应该使用for循环。
  • @juanpa.arrivillaga 谢谢,如果我能让你的大脑检查我的工作,我有: for k in range(len(arr)): cur = ki = 0 while i
  • 我知道您这样做只是为了教育目的,但不要将选择排序用于任何真实的事情。这是terrible

标签: python arrays sorting


【解决方案1】:

首先,您的代码是错误的。您可以尝试将数组放在您的函数中。 数组 = [1, 4, 7, 2, 0, 4, 6, 7, 8, 1, 3, 4]

那么,如果你使用 for 循环

def selectSort_for(list):
    if list != None:
        for i in range(len(list)):
            min = i
            for j in range(i + 1, len(list)):
                if list[min] > list[j]:
                    min = j
            if min != i:
                list[min], list[i] = list[i], list[min]

    return list

如果使用while,代码如下

def selectSort_while(list):
    if list != None:
        for i in range(len(list)):
            min = i
            x = i
            while x + 1 < len(list):
                x += 1
                j = x
                if list[min] > list[j]:
                    min = j
            if min != i:
                list[min], list[i] = list[i], list[min]

    return list

哦,你的代码是错误的,因为你错过了相等的条件。顺便说一句,

temp = arr[cur]
arr[cur] = arr[k]
arr[k] = temp

这不是 Python 风格。

你的代码应该是这样的

def selection_sort(arr):
    for k in range(len(arr)):
        cur = k
        for i in range(cur+1, len(arr)):
           if arr[cur] > arr[i]:
                cur = i

        if cur != k:
           arr[cur], arr[k] = arr[k], arr[cur]

【讨论】:

    【解决方案2】:

    我会更多地使用 python 风格:

    def sel_sort(arr):
     for k in range(len(arr)):
        sublist = arr[k:len(arr)+1]
        min_index = sublist.index(min(sublist))
        sublist[min_index], sublist[0] = sublist[0], sublist[min_index]
        arr = arr[0:k]+sublist
     return arr
    print sel_sort([5,1,4,7,5,2,8,1,4,6,9,3]) 
    

    实际上有两个嵌套循环,但第二个循环由内置函数 min() 完成。 输出为 [1, 1, 2, 3, 4, 4, 5, 5, 6, 7, 8, 9]

    几乎,python 的代码行比其他的少。

    【讨论】:

      【解决方案3】:

      while 循环嵌套在 for 循环中 -

      def selectionsort(l):
          i = 0
          while i < len(l) - 1 :
              for j in range(i+1 , len(l)):
                  if l[i] > l[j]:
                      (l[i], l[j]) = (l[j], l[i])
              i += 1
          return(l)
      
      selectionsort([74, 32, 89, 55, 21, 64])
      

      输出为 [21, 32, 55, 64, 74, 89]

      【讨论】:

        猜你喜欢
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        相关资源
        最近更新 更多