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

两个文件之间python的基数排序,python,radix-sort,Python,Radix Sort,好的,这里!我刚完成这个节目。它工作得很好,但结果不是我想要的。 这是我的全部代码: #----------class of queue---------- class queue: def __init__(self): self._queue = [] def __str__(self): sstr = "" for i in self._queue: sstr += str(i)

好的,这里!我刚完成这个节目。它工作得很好,但结果不是我想要的。 这是我的全部代码:

#----------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()
以下是输入和输出应为三行:

对于基数.in:

第1行:467119635231234858 第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行,这意味着它开始每一个新的行与一个数字排序时

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

改变这个:

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
对此(请注意最后一行中的缩进!):


可能会使用以下内容写入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_u.sort()是用C编写的。此外,Python的list_u.sort()是一个非常好的算法:Timsort
  • 基数排序有时被称为O(n),但实际上它是O(nlogn)。为什么?因为它随数字中的位数而变化,而位数是logn
  • 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))