python实现桶排序

来源:互联网 发布:淘宝双肩包店推荐 编辑:程序博客网 时间:2024/06/06 14:17

    今天利用一点时间看算法方面的东西,看到一个排序算法--------桶排序,之前并没有接触过这个东西,虽然说看了排序算法的原理之后感觉真的是很浅显易懂的,于是决定实现以下,光看懂还是不行的,树上给出了桶排序的伪代码,在这里使用python写一下,因为算法很简单,没有什么需要多说的,需要注意的地方我也都在代码中加了注释了所以看懂应该是很轻松的,下面是代码:

#!/usr/bin/env python# coding: utf-8''''
Author:沂水
功能:使用桶排序对n以内的随机生成数进行排序桶排序基本思想:初始化设置一个数组,数组中每个位置上的元素均为0,表示一开始任何一个数都没有出现,接下来对给定的待排序列表                进行统计,如a=[2,4,5,1,2],将相应位置上出现过的数字次数累加统计,如上可以得到a=[0,1,2,0,1,1],就是简单的                统计一下相应下标出的值出现次数,然后排序就完成了,只需要输出相应次数的对应下标就可以了,下面是实例演示:'''import randomdef randomnumber_generate(total_num=100, max_num=1000):     num_list = []    for i in range(total_num):        num_list.append(random.randint(0,max_num))    return num_listdef Tong_sort(num_list, total_num=100):    original_list =  []    print '---------------------------初始化开始----------------------------------'    for i in range(total_num+1): #要注意这里需要的数组元素个数总数比total_num数多一个因为下标从0开始        original_list.append(0)    print original_list    print '初始化完毕'    print '---------------------------桶排序统计开始-------------------------------'    for num in num_list:        original_list[num] += 1    print original_list    print '统计完毕'    result_list = []    for j in range(len(original_list)):        if original_list[j] != 0:            for h in range(0,original_list[j]):                result_list.append(j)    return result_listif __name__ == '__main__':    num_list = randomnumber_generate(total_num=100, max_num=200)    print '---------------------------生成随机排序列表为:--------------------------'    print num_list    original_list = Tong_sort(num_list, total_num=200)  #这里total_num=max_num,就是数组的长度值等于待排序元素的最大数的值    print '---------------------------------排序结果为:-----------------------------'    print original_list

我在代码中加入了随机序列生成器,这样就可以做到每次排序的待排序序列都是随机生成的,减少不必要的的误差,简单的运行了三次看一下实验的结果,当然,每一次的实验结果也都是不同的:

第一次结果为:
---------------------------生成随机排序列表为:--------------------------[44, 52, 5, 130, 137, 185, 122, 101, 112, 77, 199, 145, 112, 41, 174, 86, 59, 18, 32, 195, 114, 177, 18, 198, 199, 86, 172, 109, 63, 117, 115, 75, 3, 45, 182, 19, 53, 175, 38, 181, 0, 89, 87, 55, 182, 8, 94, 172, 107, 33, 70, 26, 104, 132, 48, 9, 163, 47, 72, 88, 150, 179, 121, 193, 177, 194, 114, 124, 70, 151, 177, 194, 120, 191, 77, 145, 87, 190, 9, 100, 88, 116, 53, 31, 116, 58, 66, 10, 161, 168, 191, 124, 129, 39, 162, 91, 34, 75, 20, 97]---------------------------初始化开始----------------------------------[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]初始化完毕---------------------------桶排序统计开始-------------------------------[1, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 2, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 2, 0, 1, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 2, 0, 2, 1, 2, 1, 0, 0, 1, 1, 1, 0, 2, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 1, 1, 0, 3, 0, 1, 0, 1, 2, 0, 0, 1, 0, 0, 0, 0, 1, 2, 0, 1, 2, 1, 0, 0, 1, 2, 0]统计完毕---------------------------------排序结果为:-----------------------------[0, 3, 5, 8, 9, 9, 10, 18, 18, 19, 20, 26, 31, 32, 33, 34, 38, 39, 41, 44, 45, 47, 48, 52, 53, 53, 55, 58, 59, 63, 66, 70, 70, 72, 75, 75, 77, 77, 86, 86, 87, 87, 88, 88, 89, 91, 94, 97, 100, 101, 104, 107, 109, 112, 112, 114, 114, 115, 116, 116, 117, 120, 121, 122, 124, 124, 129, 130, 132, 137, 145, 145, 150, 151, 161, 162, 163, 168, 172, 172, 174, 175, 177, 177, 177, 179, 181, 182, 182, 185, 190, 191, 191, 193, 194, 194, 195, 198, 199, 199]
第二次试验结果为:

---------------------------生成随机排序列表为:--------------------------[162, 81, 165, 9, 26, 167, 3, 46, 142, 116, 168, 89, 86, 179, 53, 24, 129, 72, 135, 65, 108, 182, 134, 197, 149, 116, 18, 69, 177, 56, 55, 176, 11, 124, 116, 76, 163, 19, 171, 65, 198, 135, 133, 81, 60, 45, 57, 47, 179, 152, 120, 182, 76, 40, 3, 110, 195, 186, 29, 122, 134, 95, 160, 143, 194, 122, 14, 57, 27, 17, 86, 97, 135, 171, 44, 174, 97, 93, 130, 180, 173, 193, 161, 199, 64, 53, 128, 138, 14, 181, 196, 96, 188, 37, 137, 53, 196, 83, 188, 162]---------------------------初始化开始----------------------------------[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]初始化完毕---------------------------桶排序统计开始-------------------------------[0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 3, 0, 1, 1, 2, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 2, 3, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 0, 1, 0, 1, 1, 0, 0, 2, 0, 1, 1, 0, 1, 1, 0, 2, 1, 1, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 0]统计完毕---------------------------------排序结果为:-----------------------------[3, 3, 9, 11, 14, 14, 17, 18, 19, 24, 26, 27, 29, 37, 40, 44, 45, 46, 47, 53, 53, 53, 55, 56, 57, 57, 60, 64, 65, 65, 69, 72, 76, 76, 81, 81, 83, 86, 86, 89, 93, 95, 96, 97, 97, 108, 110, 116, 116, 116, 120, 122, 122, 124, 128, 129, 130, 133, 134, 134, 135, 135, 135, 137, 138, 142, 143, 149, 152, 160, 161, 162, 162, 163, 165, 167, 168, 171, 171, 173, 174, 176, 177, 179, 179, 180, 181, 182, 182, 186, 188, 188, 193, 194, 195, 196, 196, 197, 198, 199]

第三次试验结果为:

---------------------------生成随机排序列表为:--------------------------[21, 112, 55, 49, 174, 174, 191, 157, 81, 127, 63, 97, 129, 83, 127, 32, 66, 188, 91, 134, 185, 40, 73, 196, 16, 117, 116, 179, 63, 68, 43, 57, 18, 19, 36, 183, 137, 153, 109, 22, 181, 72, 87, 123, 22, 128, 83, 47, 174, 189, 46, 90, 103, 34, 116, 55, 173, 192, 77, 15, 20, 20, 177, 85, 72, 133, 32, 136, 33, 151, 142, 188, 65, 29, 157, 87, 173, 169, 21, 194, 19, 68, 67, 11, 68, 8, 69, 80, 64, 122, 42, 107, 168, 6, 8, 197, 181, 138, 74, 164]---------------------------初始化开始----------------------------------[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]初始化完毕---------------------------桶排序统计开始-------------------------------[0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 3, 1, 0, 0, 2, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 2, 0, 1, 0, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 2, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 2, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 2, 3, 0, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 0, 0, 2, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0]统计完毕---------------------------------排序结果为:-----------------------------[6, 8, 8, 11, 15, 16, 18, 19, 19, 20, 20, 21, 21, 22, 22, 29, 32, 32, 33, 34, 36, 40, 42, 43, 46, 47, 49, 55, 55, 57, 63, 63, 64, 65, 66, 67, 68, 68, 68, 69, 72, 72, 73, 74, 77, 80, 81, 83, 83, 85, 87, 87, 90, 91, 97, 103, 107, 109, 112, 116, 116, 117, 122, 123, 127, 127, 128, 129, 133, 134, 136, 137, 138, 142, 151, 153, 157, 157, 164, 168, 169, 173, 173, 174, 174, 174, 177, 179, 181, 181, 183, 185, 188, 188, 189, 191, 192, 194, 196, 197]
好了,关于这个简单的排序算法就说这么多,还有很多需要去学习,欢迎交流


0 0
原创粉丝点击