python实现梳排序

    排序算法始终都是一个很经典的存在,我们熟知的有选择排序、快速排序、冒泡排序、希尔排序、堆排序、归并排序等等,相信大家也都写过很多次了,在我前面的博客里面也有了相对全面的python和Java版本的实现,如果需要的话可以翻看一下,当然代码都是抱着简单的实现一下的目的来写的,具体的性能优化都没有去做,如果接下来时间轻松点的话可以去做一下,好了,不说别的了,今天写一个算法是梳子排序,乍一听起来感觉很新鲜是吧,我也是的,这个还是我昨天在晚上查资料的时候无意间看到的一个算法,就点开看了一下,着实是因为名字很新颖,也可能是因为自己见识太少了,以至于没有听说过。

    梳排序的本质其实应该还是基于冒泡排序的思想来的,但是不同在于:梳排序并非固定的比较相邻元素之间的大小,个人觉得梳排序是融合了希尔排序和冒泡排序的思想来进行排序工作的,怎么说呢,梳排序采用的是:使用待排序数组的长度处以一个固定的数值,(在这里取的是3)得到的整数部分作为fix_distance,然后从数组的首部开始,依次比较:num_list[i]和num_list[i+fix_distance]的大小,然后按照冒泡排序的规则进行交换的操作,可以说前一部分fix_distance的取值是来源于希尔排序的思想,后一部分数值操作是来源于冒泡排序的思想。这样的操作避免了一些局部已经有序的元素还要机械的进行比较的步骤,提升了一定的速率,当fix_distance降低到一定的数值的时候(这里取得是3),不再使用除以固定值的方法来更新fix_distance了,而是简单的采用fix_distance -= 1的操作来进行更新,好了,梳排序的基本思想就说这么多,算法也很简单,现在来看一下具体的实现:

#!/usr/bin/env python
# coding: utf-8

''''
功能:使用桶排序对n以内的随机生成数进行排序
桶排序基本思想:初始化设置一个数组,数组中每个位置上的元素均为0,表示一开始任何一个数都没有出现,接下来对给定的待排序列表
                进行统计,如a=[2,4,5,1,2],将相应位置上出现过的数字次数累加统计,如上可以得到a=[0,1,2,0,1,1],就是简单的
                统计一下相应下标出的值出现次数,然后排序就完成了,只需要输出相应次数的对应下标就可以了,下面是实例演示:
'''

import random
import math

def 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_list


def Shuzi_sort(num_list):
    num_list_len = len(num_list)
    print num_list_len
    while num_list_len>=3:
        num_list_len = int(math.floor(num_list_len / 1.3))
        fix_distance = num_list_len
        print 'fix_distance is -------->', fix_distance
        for i in range(len(num_list)):
            book = i + fix_distance
            #print '待排序两个元素下标为:', i, book
            if book <= len(num_list)-1:
                if num_list[i] > num_list[i+fix_distance]: #and (i+fix_distance) <= (len(num_list)-1):
                    num_list[i], num_list[i+fix_distance] = num_list[i+fix_distance], num_list[i]

    fix_distance_two = 3
    while fix_distance_two >= 0:
        for j in range(len(num_list)):
            mark = j + fix_distance_two
            if mark <= len(num_list)-1:
                if num_list[j] > num_list[mark]: #and j+fix_distance_two <=len(num_list)-1:
                    num_list[j], num_list[mark] = num_list[mark], num_list[j]
        fix_distance_two -= 1
    return num_list

if __name__ == '__main__':
    #num_list = [2,5,8,9,4,6]
    num_list = randomnumber_generate(total_num=100, max_num=200)
    print '---------------------------生成随机排序列表为:--------------------------'
    print num_list
    print '---------------------------------排序结果为:-----------------------------'
    result_list = Shuzi_sort(num_list)
    print result_list

因为待排序数组是随机生成的,那么这里就可以多进行机组实验简单看一下排序的表现:

第一次结果为:

---------------------------生成随机排序列表为:--------------------------
[106, 120, 92, 64, 15, 28, 151, 28, 99, 90, 158, 89, 16, 26, 180, 124, 76, 136, 113, 53, 59, 15, 44, 145, 162, 187, 119, 129, 32, 12, 99, 59, 82, 126, 67, 195, 181, 27, 81, 140, 125, 135, 129, 158, 159, 76, 32, 180, 64, 11, 65, 111, 10, 134, 95, 188, 18, 189, 10, 169, 68, 54, 45, 38, 13, 80, 48, 55, 79, 128, 64, 141, 64, 19, 50, 5, 37, 9, 198, 173, 111, 124, 177, 178, 173, 35, 155, 0, 5, 19, 2, 27, 88, 83, 196, 100, 22, 76, 65, 20]
---------------------------------排序结果为:-----------------------------
100
fix_distance is --------> 76
fix_distance is --------> 58
fix_distance is --------> 44
fix_distance is --------> 33
fix_distance is --------> 25
fix_distance is --------> 19
fix_distance is --------> 14
fix_distance is --------> 10
fix_distance is --------> 7
fix_distance is --------> 5
fix_distance is --------> 3
fix_distance is --------> 2
[0, 2, 5, 5, 9, 10, 10, 11, 12, 13, 15, 15, 16, 18, 19, 19, 20, 22, 26, 27, 27, 28, 28, 32, 32, 35, 37, 38, 44, 45, 48, 50, 53, 54, 55, 59, 59, 64, 64, 64, 64, 65, 65, 67, 68, 76, 76, 76, 79, 80, 81, 82, 83, 88, 89, 90, 92, 95, 99, 99, 100, 106, 111, 111, 113, 119, 120, 124, 124, 125, 126, 128, 129, 129, 134, 135, 136, 140, 141, 145, 151, 155, 158, 158, 159, 162, 169, 173, 173, 177, 178, 180, 180, 181, 187, 188, 189, 195, 196, 198]
第二次结果为:

---------------------------生成随机排序列表为:--------------------------
[21, 194, 88, 185, 114, 195, 162, 194, 34, 19, 167, 32, 153, 162, 58, 182, 169, 12, 42, 12, 39, 126, 29, 0, 28, 59, 195, 130, 46, 116, 55, 173, 134, 63, 172, 20, 64, 171, 168, 71, 133, 82, 26, 88, 157, 62, 46, 15, 78, 86, 119, 5, 68, 91, 32, 149, 66, 79, 114, 126, 152, 130, 84, 197, 151, 16, 103, 149, 152, 96, 158, 182, 97, 177, 103, 93, 111, 123, 100, 106, 187, 29, 192, 156, 50, 131, 141, 67, 113, 138, 9, 80, 166, 95, 121, 16, 98, 107, 9, 138]
---------------------------------排序结果为:-----------------------------
100
fix_distance is --------> 76
fix_distance is --------> 58
fix_distance is --------> 44
fix_distance is --------> 33
fix_distance is --------> 25
fix_distance is --------> 19
fix_distance is --------> 14
fix_distance is --------> 10
fix_distance is --------> 7
fix_distance is --------> 5
fix_distance is --------> 3
fix_distance is --------> 2
[0, 5, 9, 9, 12, 12, 15, 16, 16, 19, 20, 21, 26, 28, 29, 29, 32, 32, 34, 39, 42, 46, 46, 50, 55, 58, 59, 62, 63, 64, 66, 67, 68, 71, 78, 79, 80, 82, 84, 86, 88, 88, 91, 93, 95, 96, 97, 98, 100, 103, 103, 106, 107, 111, 113, 114, 114, 116, 119, 121, 123, 126, 126, 130, 130, 131, 133, 134, 138, 138, 141, 149, 149, 151, 152, 152, 153, 156, 157, 158, 162, 162, 166, 167, 168, 169, 171, 172, 173, 177, 182, 182, 185, 187, 192, 194, 194, 195, 195, 197]
第三次结果为:

---------------------------生成随机排序列表为:--------------------------
[60, 7, 171, 16, 137, 98, 7, 83, 46, 70, 143, 43, 94, 189, 127, 179, 125, 129, 56, 128, 175, 16, 195, 195, 42, 58, 49, 57, 29, 188, 127, 165, 58, 50, 47, 152, 98, 82, 91, 69, 90, 78, 71, 60, 14, 2, 39, 23, 9, 17, 91, 46, 19, 47, 155, 186, 55, 43, 119, 112, 160, 6, 35, 139, 200, 9, 180, 182, 155, 50, 178, 58, 10, 20, 164, 147, 163, 29, 125, 161, 52, 200, 162, 113, 153, 108, 124, 144, 95, 17, 120, 53, 109, 34, 70, 191, 83, 80, 25, 156]
---------------------------------排序结果为:-----------------------------
100
fix_distance is --------> 76
fix_distance is --------> 58
fix_distance is --------> 44
fix_distance is --------> 33
fix_distance is --------> 25
fix_distance is --------> 19
fix_distance is --------> 14
fix_distance is --------> 10
fix_distance is --------> 7
fix_distance is --------> 5
fix_distance is --------> 3
fix_distance is --------> 2
[2, 6, 7, 7, 9, 9, 10, 14, 16, 16, 17, 17, 19, 20, 23, 25, 29, 29, 34, 35, 39, 42, 43, 43, 46, 46, 47, 47, 49, 50, 50, 52, 53, 55, 56, 57, 58, 58, 58, 60, 60, 69, 70, 70, 71, 78, 80, 82, 83, 83, 90, 91, 91, 94, 95, 98, 98, 108, 109, 112, 113, 119, 120, 124, 125, 125, 127, 127, 128, 129, 137, 139, 143, 144, 147, 152, 153, 155, 155, 156, 160, 161, 162, 163, 164, 165, 171, 175, 178, 179, 180, 182, 186, 188, 189, 191, 195, 195, 200, 200]

好了,今天关于梳排序就说这么多了,欢迎补充。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Together_CZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值