#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 用python實現了
# 氣泡排序,選擇排序,插入排序,快速排序,歸併排序
"""author: [email protected]
datetime: 2018/11/4 下午15:19
"""from __future__ import absolute_import, division, print_function, \
unicode_literals
import time
from functools import wraps
import random
defcalculate_time
(func)
:'''
列印函式執行時間
:param func: 目標函式
:return: 裝飾後的函式
'''@wraps(func)
def(
*args,
**kwargs)
: start = time.time(
) res = func(
*args,
**kwargs)
print
(time.time(
)- start)
return res
@calculate_time
def(func,
*args,
**kwargs)
:'''
裝飾遞迴函式使用的外層包裝函式
:param func: 目標函式
:param args kwargs: 目標函式所有引數
:return: 目標函式返回值
'''return func(
*args,
**kwargs)
# -------- 氣泡排序 --------
defbubble_sort
(l):
''' 氣泡排序
:param l: list 目標列表
:return: list 氣泡排序後的目標列表
'''for k in
range
(len
(l))
:for i in
range
(len
(l)- k)
:if i <
len(l)-1
:if l[i]
> l[i+1]
: l[i]
, l[i+1]
= l[i+1]
, l[i]
return l
# -------- 選擇排序 --------
defselect_sort
(l):
''' 選擇排序
:param l: list 目標列表
:return: list 選擇排序後的目標列表
'''for i in
range
(len
(l))
:for j in
range
(i,len
(l))
:if l[j]
< l[i]
: l[i]
= l[j]
return l
# -------- 插入排序 --------
definsert_sort
(l):
''' 插入排序
:param l: list 目標列表
:return: list 插入排序後的目標列表
'''for i in
range(1
,len
(l))
:for j in
range
(i):
if l[i]
< l[j]
:for k in
range
(i-1
, j-1,
-1):
l[k+1]
= l[k]
l[j]
= l[i]
break
return l
# -------- 快速排序 --------
defquick_sort
(l, start, end)
:'''
快速排序
:param l: list 目標列表
:param start: int 目標列表頭索引
:param end: int 目標列表尾索引
:return: list 快速排序後的目標列表
'''if start <= end:
i, j = start, end
base = l[i]
while i < j:
while i < j and l[j]
>= base:
j -=
1 l[i]
= l[j]
while i < j and l[i]
<= base:
i +=
1 l[j]
= l[i]
l[i]
= base
quick_sort(l, start, i -1)
quick_sort(l, i +
1, end)
return l
# -------- 歸併排序 --------
defmerge
(l, r)
:'''
合併兩個有序列表為乙個新的有序列表
:param l: list 目標有序列表l
:param r: list 目標有序列表r
:return: list 合併後的新有序列表
'''tar =
i, j =0,
0while i <
len(l)
and j <
len(r)
:if l[i]
<= r[j]:)
i +=
1else:)
j +=
1 tar += r[j:
] tar += l[i:
]return tar
defmerge_sort
(l):
''' 歸併排序
:param l: list 目標列表
:return: list 歸併排序後的目標列表
'''length =
len(l)
if length >=2:
index =
int(length /2)
llist_ = l[
:index]
rlist_ = l[index:
] llist = merge_sort(llist_)
rlist = merge_sort(rlist_)
l = merge(llist, rlist)
return l
else
:return l
if __name__ ==
"__main__"
: l =
[random.randint(1,
100000
)for x in
range
(10000)]
l =[random.randint(1,
100000
)for x in
range
(10000)]
l =[random.randint(1,
100000
)for x in
range
(10000)]
l =[random.randint(1,
100000
)for x in
range
(10000)]
0,len(l)-1
) l =
[random.randint(1,
100000
)for x in
range
(10000
)]
冒泡:12.2775378227
選擇:3.05686402321
插入:4.5859670639
快速:0.02716588974
歸併:0.0529198646545
排序演算法python實現
先列出一些演算法複雜度的識別符號號的意思,最常用的是o,表示演算法的上屆,如 2n2 o n2 而且有可能是漸進緊確的,意思是g n 乘上乙個常數係數是可以等於f n 的,就是所謂的a b。而o的區別就是非漸進緊確的,如2n o n2 o n2 確實可以作為2n的上屆,不過比較大,就是所謂的a其他符...
python排序演算法實現
coding utf 8 氣泡排序 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大 公升序 就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步...
Python實現排序演算法
一.氣泡排序 該排序重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序 如從大到小 首字母從z到a 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。穩定性 氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交...