鱼C论坛

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

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

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

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

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

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

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

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

简单暴力!
  1. def sel(lst):
  2.         newlist = []
  3.         for i in range(len(lst)):
  4.                 newlist.append(min(lst))
  5.                 lst.remove(min(lst))
  6.         return newlist
复制代码

2. 冒泡排序。
不知道为啥要叫这个名字。
潜水的来冒个泡,顶一下嘛?

每两个数比较,互换。

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

冒泡排序.gif


写了两种。第二个效率好点。

  1. def bubb(lst):
  2.         for c in range(len(lst)):
  3.                 for i in range(len(lst)-1):
  4.                         if lst[i] > lst[i+1]:
  5.                                 lst[i],lst[i+1] = lst[i+1],lst[i]
  6.         return lst
复制代码

--------------------------------------------------------------------我叫凶残分割线----------------------------------------------------------------------


  1. def bub2(lst):
  2.         for i in range(len(lst)):
  3.                 for j in range(len(lst)-1,i,-1):
  4.                         if lst[i] > lst[j]:
  5.                                 lst[i],lst[j] = lst[j],lst[i]
  6.         return lst
复制代码
3. 插入排序。
插入排序.gif

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

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

也是写出来两种,第一种比较暴力,写的也短点。
  1. def insert(lst):
  2.         for i  in range(1,len(lst)):
  3.                 j = 0
  4.                 while lst[i] > lst[j]:
  5.                         j += 1
  6.                 results = lst[i]
  7.                 lst.pop(i)
  8.                 lst.insert(j,results)
  9.         return lst
复制代码



第二种写的贼长,(其实本来我以为是堆排序,写完发现还是插入排序。)
  1. def insert2(lst):
  2.         result = []
  3.         for i  in lst:
  4.                 if len(result) == 0:
  5.                         result.append(i)
  6.                 else:
  7.                         for j in range(len(result)-1,-1,-1):
  8.                                 if i < result[j]:
  9.                                         if i > result[j-1]:
  10.                                                 result.insert(j,i)
  11.                                                 break
  12.                                         elif j-1 < 0:
  13.                                                 result.insert(j,i)
  14.                                                 break                                                
  15.                                         else:
  16.                                                 continue
  17.                                 else:
  18.                                         result.insert(j+1,i)
  19.                                         break
  20.         return result
复制代码

4. 快速排序。

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


代码也好写,速度也快,利用递归。
  1. def fast(lst):
  2.         if len(lst) <= 1:
  3.                 return lst
  4.         else:
  5.                 temp1 = [i for i in lst[1:] if i < lst[0]]
  6.                 temp2 = [i for i in lst[1:] if i >= lst[0]]
  7.                 return fast(temp1)+ lst[:1] +fast(temp2)
复制代码

5.堆排序。
这个没写出来,不知道该怎么弄个二叉树。效果图。
堆排序.gif


代码

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


代码:

游客,如果您要查看本帖隐藏内容请回复
7. 到底哪家强?。
这一坨长代码。
  1. if __name__ == '__main__':
  2.         import time
  3.         import random
  4.         list2 = []
  5.         for i in range(5000):
  6.                 list2.append(random.randint(1,10000))
  7.         list1 = list2[:]
  8.         print('列表长度:%d'%(len(list1)))
  9.         t1 = time.clock()
  10.         t = sel(list1)
  11.         t2 = time.clock()
  12.         print(t,'\n')
  13.         list1 = list2[:]
  14.         print('选择排序用时%f'%(t2-t1))
  15.         t1 = time.clock()
  16.         t = bubb(list1)
  17.         t2 = time.clock()
  18.         print(t,'\n')
  19.         list1 = list2[:]
  20.         print('冒泡排序第一种用时%f'%(t2-t1))
  21.         t1 = time.clock()
  22.         t = bub2(list1)
  23.         t2 = time.clock()
  24.         print(t,'\n')
  25.         list1 = list2[:]
  26.         print('冒泡排序第二种用时%f'%(t2-t1))
  27.         t1 = time.clock()
  28.         t = insert(list1)
  29.         t2 = time.clock()
  30.         print(t,'\n')
  31.         list1 = list2[:]
  32.         print('插入排序第一种用时%f'%(t2-t1))
  33.         t1 = time.clock()
  34.         t = insert2(list1)
  35.         t2 = time.clock()
  36.         print(t,'\n')
  37.         list1 = list2[:]
  38.         print('插入排序第二种用时%f'%(t2-t1))
  39.         t1 = time.clock()
  40.         t = fast(list1)
  41.         t2 = time.clock()
  42.         print(t,'\n')
  43.         list1 = list2[:]
  44.         print('快速排序用时%f'%(t2-t1))
  45.         t1 = time.clock()
  46.         t = sorted(list1)
  47.         t2 = time.clock()
  48.         print(t,'\n')
  49.         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-4-25 22:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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