使用嵌套while循环的Python Selection排序

时间:2018-02-04 00:30:42

标签: python arrays sorting

我知道我可以使用带有嵌套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循环似乎更简单,不是吗?然而,我对它是如何完成感到困惑。

3 个答案:

答案 0 :(得分:1)

首先,你的代码是错误的。你可以尝试将数组放入你的函数中。 array = [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

这不是一种pythonic造型。

您的代码可能应该是这样的

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]

答案 1 :(得分:0)

我将更多地使用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的代码行数比其他代码行少。

答案 2 :(得分:0)

虽然循环嵌套在for循环中-

os.path.realpah

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