不使用内置的sort、min、max函数,对数字列表进行排序

22

如果我有一个长度每次都不同的列表,并且想要将其从小到大排序,我该怎么做?

如果我有:[-5, -23, 5, 0, 23, -6, 23, 67]

我想要:[-23, -6, -5, 0, 5, 23, 23, 67]

我先有这个:

data_list = [-5, -23, 5, 0, 23, -6, 23, 67]

new_list = []

minimum = data_list[0]  # arbitrary number in list 

for x in data_list: 
  if x < minimum:
    minimum = value
    new_list.append(i)
但是这只运行一次,我得到的结果是:
new_list = [-23] 

我卡在这个地方了。

如何在不使用内置的max、min、sort函数的情况下,循环遍历直到len(new_list) = len(data_list)(即所有数字都在新列表中),并确保一切都已排序? 我不确定是否需要创建一个新列表。

26个回答

50

我猜你想做的是这样的:

data_list = [-5, -23, 5, 0, 23, -6, 23, 67]
new_list = []

while data_list:
    minimum = data_list[0]  # arbitrary number in list 
    for x in data_list: 
        if x < minimum:
            minimum = x
    new_list.append(minimum)
    data_list.remove(minimum)    

print (new_list)

#添加圆括号


23
l = [64, 25, 12, 22, 11, 1,2,44,3,122, 23, 34]

for i in range(len(l)):
    for j in range(i + 1, len(l)):

        if l[i] > l[j]:
           l[i], l[j] = l[j], l[i]

print l

输出:

[1, 2, 3, 11, 12, 22, 23, 25, 34, 44, 64, 122]

2
这个解决方案非常优雅,因为它简单、简洁且缺乏内置函数。 - spacedustpi

6
这严格遵循您不使用sort()min()max()的要求,但也是使用Python最佳实践,不重新发明轮子。
data_list = [-5, -23, 5, 0, 23, -6, 23, 67]
import heapq
heapq.heapify(data_list)
new_list = []
while data_list:
    new_list.append(heapq.heappop(data_list)))

我建议查看Python库中的heapq.py,以了解它的工作原理。堆排序是一种非常有趣的排序算法,因为它可以让你“排序”无限流,即你可以快速获取当前最小的项,并有效地将新项添加到要排序的数据中。


5

我一直在尝试做的事情是插入排序(不是最好的排序方法,但可以解决问题)。

def sort(list):
    for index in range(1,len(list)):
        value = list[index]
        i = index-1
        while i>=0:
            if value < list[i]:
                list[i+1] = list[i]
                list[i] = value
                i -= 1
            else:
                break

2

这很有效!

def sorting(li):
    for i in range(len(li)):
        for j in range(len(li)):
            if li[i] < li[j]:
                li[j],li[i] = li[i],li[j]
    return li

listToSort = [22,11,23,1,100,24,3,101,2,4]
print(sorting(listToSort))

1

尝试对列表进行排序,字符有ASCII代码,可以使用相同的方法对字符列表进行排序。

aw=[1,2,2,1,1,3,5,342,345,56,2,35,436,6,576,54,76,47,658,8758,87,878]
for i in range(aw.__len__()):
    for j in range(aw.__len__()):
        if aw[i] < aw[j] :aw[i],aw[j]=aw[j],aw[i]

1
data = [3, 1, 5, 2, 4]
n = len(data)
    for i in range(n):
        for j in range(1,n):
            if data[j-1] > data[j]:
                (data[j-1], data[j]) = (data[j], data[j-1])
    print(data)

3
虽然这段代码可能解决了问题,但包括一个解释关于如何以及为什么解决这个问题将有助于提高您的帖子质量,并可能导致更多的点赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请编辑您的答案添加解释,并指出适用的限制和假设。 - Pika Supports Ukraine

1
def bubble_sort(seq):
    """Inefficiently sort the mutable sequence (list) in place.
       seq MUST BE A MUTABLE SEQUENCE.

       As with list.sort() and random.shuffle this does NOT return 
    """
    changed = True
    while changed:
        changed = False
        for i in xrange(len(seq) - 1):
            if seq[i] > seq[i+1]:
                seq[i], seq[i+1] = seq[i+1], seq[i]
                changed = True
    return None

if __name__ == "__main__":
   """Sample usage and simple test suite"""

   from random import shuffle

   testset = range(100)
   testcase = testset[:] # make a copy
   shuffle(testcase)
   assert testcase != testset  # we've shuffled it
   bubble_sort(testcase)
   assert testcase == testset  # we've unshuffled it back into a copy

来自: http://rosettacode.org/wiki/Bubble_Sort#Python


它只是对数组进行随机化...所以不要使用shuffle等函数,只需将列表传递给bubble_sort函数即可。 - Joran Beasley
bubble_sort(data_list);print data_list - Joran Beasley
噢,那你应该用什么呢?只有选择吗? - Joran Beasley
好问题。理论上,我想先找到最小值,将其附加到一个新列表中,然后每个随后的#都是下一个最小值(通过迭代列表或可能使用for循环)。 - user1589244

1

这里有一个效率不是很高的排序算法 :)

>>> data_list = [-5, -23, 5, 0, 23, -6, 23, 67]
>>> from itertools import permutations
>>> for p in permutations(data_list):
...     if all(i<=j for i,j in zip(p,p[1:])):
...         print p
...         break
... 
(-23, -6, -5, 0, 5, 23, 23, 67)

谢谢!我对Python和intertools都很陌生,当我在谷歌上搜索时,也发现了排列组合,但我也无法使用它们。 - user1589244
那个方法已经接近于一个梗了。我喜欢它! - AlexNe

1
# Your current setup
data_list = [-5, -23, 5, 0, 23, -6, 23, 67]
new_list  = []

# Sort function
for i in data_list:
    new_list = [ x for x in new_list if i > x ] + [i] + [ x for x in new_list if i <= x ]

2
尽管这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文信息可以增加其长期价值。 - Nic3500
为你的逻辑添加解释。 - shaik moeed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接