Python實現排序演算法(上)

2021-08-30 22:09:46 字數 4305 閱讀 3394

#!/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 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。穩定性 氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交...