[数据结构][Python]鸡尾酒排序、桶排序

鸡尾酒排序:

#!/usr/bin/python
def _cocktail_sort(the_list):
    the_len = len(the_list)
    if the_len <2:#0和1
        print("无需排序")
        return the_list
    else:
        while 1:
            flag = False
            for i in range(the_len-1):
                if the_list[i] > the_list[i+1]:
                    the_list[i], the_list[i+1] = the_list[i+1], the_list[i]
                print(the_list)
            j = the_len-1
            while j > 0:
                if the_list[j-1] > the_list[j]:
                    the_list[j], the_list[j-1] = the_list[j-1], the_list[j]
                    flag = True
                j -= 1
                print(the_list)
            if flag == False:
                break
        return the_list
if __name__ == '__main__':
    the_list = [6, 4, 5, 1, 8, 7, 2, 3]
    print("原始的列表是:" + str(the_list))
    print("鸡尾酒排序之后的列表是:" + str(_cocktail_sort(the_list)))
原始的列表是:
[6, 4, 5, 1, 8, 7, 2, 3]
[4, 6, 5, 1, 8, 7, 2, 3]
[4, 5, 6, 1, 8, 7, 2, 3]
[4, 5, 1, 6, 8, 7, 2, 3]
[4, 5, 1, 6, 8, 7, 2, 3]
[4, 5, 1, 6, 7, 8, 2, 3]
[4, 5, 1, 6, 7, 2, 8, 3]
[4, 5, 1, 6, 7, 2, 3, 8]
[4, 5, 1, 6, 7, 2, 3, 8]
[4, 5, 1, 6, 7, 2, 3, 8]
[4, 5, 1, 6, 2, 7, 3, 8]
[4, 5, 1, 2, 6, 7, 3, 8]
[4, 5, 1, 2, 6, 7, 3, 8]
[4, 1, 5, 2, 6, 7, 3, 8]
[1, 4, 5, 2, 6, 7, 3, 8]
[1, 4, 5, 2, 6, 7, 3, 8]
[1, 4, 5, 2, 6, 7, 3, 8]
[1, 4, 2, 5, 6, 7, 3, 8]
[1, 4, 2, 5, 6, 7, 3, 8]
[1, 4, 2, 5, 6, 7, 3, 8]
[1, 4, 2, 5, 6, 3, 7, 8]
[1, 4, 2, 5, 6, 3, 7, 8]
[1, 4, 2, 5, 6, 3, 7, 8]
[1, 4, 2, 5, 6, 3, 7, 8]
[1, 4, 2, 5, 3, 6, 7, 8]
[1, 4, 2, 3, 5, 6, 7, 8]
[1, 4, 2, 3, 5, 6, 7, 8]
[1, 2, 4, 3, 5, 6, 7, 8]
[1, 2, 4, 3, 5, 6, 7, 8]
[1, 2, 4, 3, 5, 6, 7, 8]
[1, 2, 4, 3, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
鸡尾酒排序之后的列表是:
[1, 2, 3, 4, 5, 6, 7, 8]

桶排序:

如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort)。留置一个数组S,里面含有M个桶,初始化为0。然后遍历数组A,读入Ai时,S[Ai]增一。所有输入被读进后,扫描数组S得出排好序的表。该算法时间花费O(M+N),空间上不能原地排序。
桶排序原理:

桶排序也叫计数排序,简单来说,就是将数据集里面所有元素按顺序列举出来,然后统计元素出现的次数。最后按顺序输出数据集里面的元素。

排序过程如下:

一、初始化桶的大小

把数据集里面每一个元素当作一个桶,由上面问题看出,原始数据范围在0–9之间,因此我就需要有10个桶,如下图

在这里插入图片描述

第一行为初始化计数为0,第二行为各个元素。

二、计数

接下来读入第一原始数据为6,则在下标为6的桶中增加1,如下图:

在这里插入图片描述

再读入下一个原始数据为8,则在下标为8的桶中增加1,如下图:

在这里插入图片描述

以此类推,最后遍历完所有原始数据时,10个桶的计数如下图:

在这里插入图片描述

三、输出数据

在完成原始数据的遍历计数后,接下来遍历各个桶,输出数据:

元素0计数为1,则输出0,

元素1计数为2,则输出1 1,

元素2计数为1,则输出2,

元素3计数为1,则输出3,

元素4计数为1,则输出4,

元素5计数为1,则输出5,

元素6计数为1,则输出6,

元素7计数为0,则不输出元素,

元素8计数为1,则输出8,

元素9计数为1,则输出9,

最后结果输出为:0, 1, 1, 2, 3, 4, 5, 6, 8, 9

#!/usr/bin/env python
#-*- coding:utf8 -*-

class BucketSort(object):
    '''
    self.datas:       要排序的数据列表
    self.bucketSize:  水桶的大小(数据集的范围,如bucketSize=10,
                      则表示数据集的范围为0-9)
    self.result:      保存排序后的结果
    self.bucket:      代表水桶,指数据集内的所有元素
    _sort():          排序函数
    show():           输出结果的函数

    用法:
    BucketSort(datas, size)   或者BucketSort(datas),size的默认值为100

    BucketSort(datas)._sort() 这样就是开始排序
    BucketSort(datas).show()  这样就可以把排序后的结果输出
    '''
    def __init__(self, datas, size=100):
        self.datas = datas
        self.bucketSize = size
        self.result = [0 for i in range(len(datas))]
        self.bucket = [0 for i in range(self.bucketSize)]

    def _sort(self):
        # 读入各个元素,并在对应的位置统计,当bucket里的元素不为0
        # 就保存到result里面
        for num in self.datas:
            self.bucket[num] += 1
        j = 0
        for i in range(self.bucketSize):
            while(self.bucket[i]):
                self.result[j] = i
                self.bucket[i] -= 1
                j += 1

    def show(self):
        print "Resutl is:",
        for i in self.result:
            print i,
        print ''


if __name__ == '__main__':
    try:
        size = raw_input("Please input size(default=100):")
        if size:
            size = int(size)
        datas = raw_input('Please input some number:')
        datas = datas.split()
        datas = [int(datas[i]) for i in range(len(datas))]
    except Exception:
        pass
    if size:
        bks = BucketSort(datas, size)
    else:
        bks = BucketSort(datas)
    bks._sort()
    bks.show()

知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值