鱼C论坛

 找回密码
 立即注册
查看: 30667|回复: 148

[技术交流] 排序技术哪家强,各种排序算法。

  [复制链接]
发表于 2014-12-3 19:57:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wei_Y 于 2014-12-7 10:52 编辑

不是各种啦,只写出来4种,有的效率好点,有的跑不出结果- -。

1. 选择排序。
每次选择最小的一项放到最前面。
这个不用太动脑子,直接min上。
效率 : 需要的次数是取决于列表的长度。
选择排序.gif

简单暴力!
def sel(lst):
        newlist = []
        for i in range(len(lst)):
                newlist.append(min(lst))
                lst.remove(min(lst))
        return newlist
2. 冒泡排序。
不知道为啥要叫这个名字。
潜水的来冒个泡,顶一下嘛?

每两个数比较,互换。

效率: 因为不会一次性换完,效率最小会是列表长度的平方。(慢。)

冒泡排序.gif


写了两种。第二个效率好点。
def bubb(lst):
        for c in range(len(lst)):
                for i in range(len(lst)-1):
                        if lst[i] > lst[i+1]:
                                lst[i],lst[i+1] = lst[i+1],lst[i]
        return lst
--------------------------------------------------------------------我叫凶残分割线----------------------------------------------------------------------

def bub2(lst):
        for i in range(len(lst)):
                for j in range(len(lst)-1,i,-1):
                        if lst[i] > lst[j]:
                                lst[i],lst[j] = lst[j],lst[i]
        return lst
3. 插入排序。
插入排序.gif

从前或后(想从中间也不是不可以。)依次选取,然后选择他应该的位置,然后狠狠的插进去(tip: 姿势要正确)。

效率: 最差应该是列表长度的平方,但是比冒泡要好(至少我试的是这样)。

也是写出来两种,第一种比较暴力,写的也短点。
def insert(lst):
        for i  in range(1,len(lst)):
                j = 0
                while lst[i] > lst[j]:
                        j += 1
                results = lst[i]
                lst.pop(i)
                lst.insert(j,results)
        return lst


第二种写的贼长,(其实本来我以为是堆排序,写完发现还是插入排序。)
def insert2(lst):
        result = []
        for i  in lst:
                if len(result) == 0:
                        result.append(i)
                else:
                        for j in range(len(result)-1,-1,-1):
                                if i < result[j]:
                                        if i > result[j-1]:
                                                result.insert(j,i)
                                                break
                                        elif j-1 < 0:
                                                result.insert(j,i)
                                                break                                                
                                        else:
                                                continue
                                else:
                                        result.insert(j+1,i)
                                        break
        return result
4. 快速排序。

选择一个数(随机数,中位数,指定数等。)
每次将列表分成小于这个数,和大于这个数。(这个数归在哪里都可以。)
然后一直分啊分,直到每个分组都剩下一个。
效率: 高,要不怎么叫快速排序~,人品不好也只能是列表长度的平方了。
快速排序.gif


代码也好写,速度也快,利用递归。
def fast(lst):
        if len(lst) <= 1:
                return lst
        else:
                temp1 = [i for i in lst[1:] if i < lst[0]]
                temp2 = [i for i in lst[1:] if i >= lst[0]]
                return fast(temp1)+ lst[:1] +fast(temp2)
5.堆排序。
这个没写出来,不知道该怎么弄个二叉树。效果图。
堆排序.gif


代码

游客,如果您要查看本帖隐藏内容请回复
6. 归并排序。
依然不会写,效果图。
归并排序.gif


代码:

游客,如果您要查看本帖隐藏内容请回复
7. 到底哪家强?。
这一坨长代码。
if __name__ == '__main__':
        import time
        import random
        list2 = []
        for i in range(5000):
                list2.append(random.randint(1,10000))
        list1 = list2[:]
        print('列表长度:%d'%(len(list1)))
        t1 = time.clock()
        t = sel(list1)
        t2 = time.clock()
        print(t,'\n')
        list1 = list2[:]
        print('选择排序用时%f'%(t2-t1))
        t1 = time.clock()
        t = bubb(list1)
        t2 = time.clock()
        print(t,'\n')
        list1 = list2[:]
        print('冒泡排序第一种用时%f'%(t2-t1))
        t1 = time.clock()
        t = bub2(list1)
        t2 = time.clock()
        print(t,'\n')
        list1 = list2[:]
        print('冒泡排序第二种用时%f'%(t2-t1))
        t1 = time.clock()
        t = insert(list1)
        t2 = time.clock()
        print(t,'\n')
        list1 = list2[:]
        print('插入排序第一种用时%f'%(t2-t1))
        t1 = time.clock()
        t = insert2(list1)
        t2 = time.clock()
        print(t,'\n')
        list1 = list2[:]
        print('插入排序第二种用时%f'%(t2-t1))
        t1 = time.clock()
        t = fast(list1)
        t2 = time.clock()
        print(t,'\n')
        list1 = list2[:]
        print('快速排序用时%f'%(t2-t1))
        t1 = time.clock()
        t = sorted(list1)
        t2 = time.clock()
        print(t,'\n')
        print('内置sorted排序用时%f'%(t2-t1))
360截图20141203195520826.jpg

还是python内置的牛掰,完全不是一个等级,难道是我写的太渣了。。
堆排序和归并排序有兴趣自己搞搞吧,我反正木搞懂。。





评分

参与人数 9荣誉 +33 鱼币 +33 贡献 +13 收起 理由
_2_ + 2 + 2 鱼C有你更精彩^_^
小甲鱼 + 10 + 10 + 5 热爱鱼C^_^
ko12 + 1 + 1 感谢楼主无私奉献!
破灬王 + 5 + 5 + 2 热爱鱼C^_^
康小泡 + 5 + 5 + 2 真棒这个
阳光影子 + 2 + 2 不错,支持一下
漠水 + 1 + 2 + 1 感谢楼主无私奉献!
aishenwang + 2 + 1 + 1 感谢楼主无私奉献!
拈花小仙 + 5 + 5 + 2 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-3 22:43:10 | 显示全部楼层
冒泡排序是这样解释的:大的往下沉,小的往上浮——就像冒泡泡一样!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 00:46:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-4 08:57:41 | 显示全部楼层
厉害厉害~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 09:12:21 | 显示全部楼层
真心复杂,编程好费脑细胞啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 09:33:19 | 显示全部楼层
编程好复杂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-4 09:40:36 | 显示全部楼层
~风介~ 发表于 2014-12-3 22:43
冒泡排序是这样解释的:大的往下沉,小的往上浮——就像冒泡泡一样!

呦西,原来如此。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 09:55:55 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-4 10:06:39 | 显示全部楼层
强烈支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 10:19:50 | 显示全部楼层
专业的样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 10:37:03 | 显示全部楼层
           支持!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 10:55:42 | 显示全部楼层
可以收藏哟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 12:03:01 | 显示全部楼层
这么高大上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 12:54:18 | 显示全部楼层
很牛啊,看来还需很努力学习才行啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 13:10:41 | 显示全部楼层
太叼了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 20:25:49 | 显示全部楼层
已经对楼主无语
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-4 20:40:19 | 显示全部楼层

怎么了- -。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-4 23:24:08 | 显示全部楼层
这个好屌,赶快mark
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-5 00:48:19 | 显示全部楼层
太厉害了 怒赞{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-5 08:56:36 | 显示全部楼层
给力
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 13:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表