手动对整数列表进行排序

问题描述 投票:0回答:8

我对编程还很陌生;我只学习了几个星期的Python。最近有人给我一个练习,要求我生成一个整数列表,然后在单独的列表中手动将数字从最低到最高排序。

import random
unordered = list(range(10))
ordered = []
lowest = 0
i = 0

random.shuffle(unordered)

lowest = unordered[0]

while i in unordered:
    if  unordered[i] < lowest:
        lowest = unordered[i]
        i += 1
    if i >= len(unordered):
        i = 0

ordered.append(lowest)
unordered.remove(lowest)
lowest = unordered[i]

print(ordered)

这是我到目前为止所拥有的,坦率地说,它根本不起作用。我得到的伪代码是这样的:

  • 创建一个空列表来保存有序元素
  • 当无序列表中还有元素时
    • 将变量(最低)设置为无序列表中的第一个元素
    • 对于无序列表中的每个元素
      • 如果元素低于最低值
      • 将该元素的值分配给最低值
    • 将最低的添加到有序列表中
    • 从无序列表中删除最低的
  • 打印出订购清单

到目前为止,我遇到的最大问题是我的计数器无法可靠地为我提供一种从无序列表中挑选出最低数字的方法。然后我在索引列表时遇到问题,即索引超出范围。谁能给我一些关于我哪里出错的反馈?

另外,我得到了这个我不太确定的信息:

您可以使用一种既定的方法对列表进行排序,称为选择排序。

这次我不应该使用 Python 的内置排序方法。这一切都应该手动完成。

python list sorting integer
8个回答
6
投票

您无需创建另一个列表即可执行此操作。

x = [5, 4, 3, 2, 5, 1]
n = len(x)

# Traverse through all list elements
for i in range(n):

# Traverse the list from 0 to n-i-1
# (The last element will already be in place after first pass, so no need to re-check)
for j in range(0, n-i-1):

    # Swap if current element is greater than next
    if x[j] > x[j+1]:
        x[j], x[j+1] = x[j+1], x[j]
print(x)

这适用于重复项和降序列表。它还包括一个小的优化,以避免对最后一个元素进行不必要的比较。

注意:这个答案和所有其他答案都使用冒泡排序,这很简单但效率低下。如果您正在寻求性能,那么使用另一种排序算法会更好。请参阅 哪个是最好的排序算法以及为什么?


3
投票

您刚刚弄错了一些顺序:您每次都需要追加到您的有序列表中

import random
unordered = list(range(10))
ordered = []
i = 0

random.shuffle(unordered)

print unordered
lowest = unordered[0]

while len(unordered) > 0:
    if  unordered[i] < lowest:
        lowest = unordered[i]
    i += 1
    if i == len(unordered):
        ordered.append(lowest)
        unordered.remove(lowest)
        if unordered:
          lowest = unordered[0]
        i = 0

print(ordered)

2
投票

你不应该创建一种新的列表排序算法,只需实现这个算法: http://en.wikipedia.org/wiki/Bubble_sort


1
投票

我发现这对于任意数量的输入都非常有效

    x = [3, 4, 100, 34, 45]
    for i in range(len(x) - 1):
        if x[i] > x[i + 1]:
            x[i],x[i + 1] = x[i + 1], x[i]
    print (x)

0
投票

如果有重复元素,上面的代码将不起作用。

ordered=[]
i=0
j=0
x = [100, 3, 4, 100, 34, 45]
lowest=x[0]
while len(x)>0:
    for i in range(0,len(x)):
        if x[i]<=lowest:
            lowest=x[i]
    ordered.append(lowest)
    x.remove(lowest)
    if len(x)>1:
        lowest=x[0]
print(ordered)

0
投票
def sort(x):
    l=len(x)
    for i in range(l):
        for j in range((i+1),l):
            if x[i]>x[j]:
                l1=x[i]
                x[i]=x[j]
                x[j]=l1
    print(x)                
l=[8,4,2,6,5,1,12,18,78,45]
sort(l)

0
投票

从列表中的第一个数字开始,运行循环以找到最小值。之后将它们与列表中的第一个数字交换。对列表中剩余的数字重复此循环方法。

nlist=[int(a) for a in input('Please insert your list of numbers ').split()]

for loop1 in range (0,len(nlist)-1): # outer loop
    min=nlist[loop1]
    for loop2 in range (loop1 + 1,len(nlist)): # inner loop to compare
        if min > nlist[loop2]:
           min=nlist[loop2]
           index=loop2           
    if nlist[loop1] != min:
        swap=nlist[loop1]
        nlist[loop1]=min
        nlist[index]=swap
       
print('Your hand-sorted list is',nlist) 

0
投票
my_list = [10, 4, 1, 9, 6, 1, 5, 4, 3, -10]

def find_min(x):
    min_value = x[0]
    for i in x:
        if i < min_value:
            min_value = i
    return min_value


def delete_element(list_, element):
    shorted_list = []
    find_flag = 0
    for i in list_:
        if (i!=element):
            shorted_list.append(i)
        elif (i==element):
            if find_flag==1:
                shorted_list.append(i)
            find_flag = 1
    return shorted_list


def sort_list(x):
    sorted_list = []
    for _ in x:
        min_value = find_min(x)
        sorted_list.append(min_value)
        x = delete_element(x, min_value)
    return sorted_list

print(sort_list(my_list))
© www.soinside.com 2019 - 2024. All rights reserved.