两个文件之间的基数排序的python

Posted

技术标签:

【中文标题】两个文件之间的基数排序的python【英文标题】:radix sort of python between tow files 【发布时间】:2014-04-14 01:51:50 【问题描述】:

好的!我刚刚完成了这个程序。它运作良好,但结果不是我想要的。 这是我的全部代码:

#----------class of queue----------
class queue:
    def __init__(self):
        self._queue = []

    def __str__(self):
        sstr = ""
        for i in self._queue:
            sstr += str(i)
            sstr += ", "
        return sstr

    def __len__(self):
        return len(self._queue)

    def after(self):
        return self._queue.pop(0)

    def add(self, i):
        self._queue.append(i)

#----------radix sort----------
def set_output():
    output_list = []
    for i in range (10):
        output_list.append(queue())
    return output_list

def set_radix(lists):
    output_list = set_output()
    for number in lists:
        a = number[2]
        output_list[int(a)].add(number)
    return output_list

def sec_radix(input_list, i):
    output_list = set_output()
    for queue in input_list:
        while len(queue) > 0:
            num = queue.after()
            a = num[i]
            output_list[int(a)].add(num)
    return output_list

def done_radix(num_list):
    return sec_radix(sec_radix(set_radix(num_list), 1), 0)

#----------read and write file----------        
def readfile(infile):
    print "Reading files, please wait..."
    f = open(infile, "r")
    lineList = f.readlines()
    f.close()
    outputList = []
    for line in lineList:
        line = line.strip()
        outputList.append(line.split(" "))
        print "Reading finished!"
    return outputList

def writefile(outfile, nums):
    print "Writing files, please wait..."
    output = new_output(nums)
    f = open(outfile, "w")
    f.write(output)
    print "Writing finished!"

def new_output(three_list):
    output = ""
    for queue_list in three_list:
        for numqueue in queue_list:
            while len(numqueue) > 0:
                output += numqueue.after()
                output += " "
                output += "\n"
    return output

#----------main function----------
def main():
    infile = readfile("radix.in")
    final_list = []
    for num_list in infile:
        print "Sorting..."
        final_list.append(done_radix(num_list))
    print "Sorting finished!"
    writefile("radix.out", final_list)

main()

这里的输入和输出应该是三行:

对于 radix.in:

第 1 行:467 119 635 231 234 858 第 2 行:786 463 715 745 729 574 856 806 339 106 487 第 3 行:798 791 392 916 177 115 948 871 525

对于 radix.out:

第 1 行:119 231 234 467 635 858 第 2 行:106 339 463 487 574 715 729 745 786 806 856 3号线:​​115 177 392 525 791 798 871 916 948

当你运行这个程序时,你需要有两个文件在同一个路径(同一个文件夹)。当你完成运行时,结果应该是上面的 radix.out, 这真的是连线...应该只是创建三行,但有26行,这意味着它在排序时以一个数字开始每一新行。

它怎么能像上面那样打印出三行。

【问题讨论】:

【参考方案1】:

改变这个:

def new_output(three_list):
    output = ""
    for queue_list in three_list:
        for numqueue in queue_list:
            while len(numqueue) > 0:
                output += numqueue.after()
                output += " "
                output += "\n"
    return output

对此(注意最后一行的缩进!):

def new_output(three_list):
    output = ""
    for queue_list in three_list:
        for numqueue in queue_list:
            while len(numqueue) > 0:
                output += numqueue.after()
                output += " "
        output += "\n"
    return output

【讨论】:

【参考方案2】:

也许写到 outfile 类似:

with open('radix.out', 'w') as outfile:
    for sublist in final_list:
        list1 = (str(element).strip() for element in sublist)
        list2 = (element for element in list1 if element)
        list3 = (element.rstrip(',') for element in list2)
        string = ', '.join(list3)
        outfile.write('\n'.format(string))

顺便说一句,使用 list_.sort() 可能比编写自己的基数排序更好。这有两个原因:

    用 Python 编写排序往往比用 C 编写排序要慢,而且 Python 的 list_.sort() 是用 C 编写的。另外,Python 的 list_.sort() 是一个非常好的算法:Timsort。 基数排序有时被称为 O(n),但实际上它是 O(nlogn)。为什么?因为它随着你号码的位数而变化,位数是logn。

【讨论】:

以上是关于两个文件之间的基数排序的python的主要内容,如果未能解决你的问题,请参考以下文章

我应该在基数排序中使用哪个基数?以及如何在基数之间转换?

“基数排序”展现Python的优雅与简洁

算法:排序之桶排序和基数排序

基数排序

你需要知道的九大排序算法Python实现之基数排序

基数排序和更改基数