如何在不使用排序功能的情况下在python中排序一千万个数字?

时间:2018-08-06 16:30:09

标签: python sorting

使用python在不使用内置函数的情况下对1到100之间的随机生成的1000万个数字进行排序,Quicksort在这里没有为我工作。

我使用了上述链接中的quicksort代码: http://interactivepython.org/runestone/static/pythonds/SortSearch/TheQuickSort.html

我在执行它时遇到错误: 对于x范围(0,100000):     listOfNumbers.append(random.randint(1,100))

quickSort(listOfNumbers) 打印(listOfNumbers)

RuntimeError:超过最大递归深度

3 个答案:

答案 0 :(得分:2)

您可以使用所需的任何排序算法,只要正确实现即可。但是问题是要求使用radix sort。特别是最笨拙的基数排序,一个存储桶计数器。

您总共有N=10,000,000个值和一系列M=100个不同的值。存储桶计数器将花费O(N+M)的时间,这比O(N*log N)O(M)的空间好, 1 可以忽略不计,并且。最重要的是,它非常简单:

def bucketsorted100(xs):
    buckets = [0] * 101
    for x in xs:
        buckets[x] += 1
    for x, count in enumerate(buckets):
        yield from [x] * count

您显然可以扩展为不对1-100的数字进行硬编码(实际上,我对0-100的数字进行硬编码,浪费了1%的空间,但是谁在乎呢?)。或者,您可以添加对key函数的支持。或者,您可以使用Counter而不是list来使其更简单。


1。从技术上讲,它是O(logN * M)空间,因为计数范围最多为N,占用logN位,该值最多范围为100,占用恒定位数。但是实际上,所有计数都适合CPython中的单个30位“数字”,因此logN因素永远不会出现。

答案 1 :(得分:1)

您可以使用强大的Bogosort

import random

def is_sorted(data):
    for i in range(len(data) - 1):
        if data[i] > data[i + 1]:
            return False
    return True

def bogosort(data):
    while not is_sorted(data):
        random.shuffle(data)
    return data

答案 2 :(得分:0)

也许numpy会更快...您可以将数字转换为numpy array然后使用numpy.sort

赞:

import numpy as np
mylist=[15,65,3,1,10,35,11,65,23,95,20,36,85,12,37,85,46,93] # ...
sorted_mylist=np.ndarray.tolist(np.sort(np.asarray(mylist)))
print sorted_mylist

为您提供:

[1, 3, 10, 11, 12, 15, 20, 23, 35, 36, 37, 46, 65, 65, 85, 85, 93, 95]