各种常用算法

import random
import time
import sys
sys.setrecursionlimit(10000)


def cal_time(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print('%s 执行的时间是 %s' % (func.__name__, end-start))
return res
return wrapper



# 冒泡排序
# 时间复杂度: O(n^2)
# 空间复杂度: O(1)
@cal_time
def bubble_sort(li):
for i in range(len(li)-1):
flag = False
for j in range(len(li)-i-1):
if li[j+1] < li[j]:
li[j+1], li[j] = li[j], li[j+1]
flag = True
if not flag:
return

# 选择排序
# 时间复杂度: O(n^2)
# 空间复杂度: O(1)
@cal_time
def select_sort(li):
for i in range(len(li)-1):
minLoc = i # minLoc = 0
for j in range(i+1,len(li)):
if li[j] < li[minLoc]: # li[2] < li[0]
li[j], li[minLoc] = li[minLoc], li[j]

# 插入排序
# 时间复杂度: O(n^2)
# 空间复杂度: O(1)
@cal_time
def insert_sort(li):
for i in range(1,len(li)):
tmp = li[i] # 第一次 :tmp = li[1] = 7 第二次: tmp = li[2] = 4
j = i - 1 # 第一次:j = 1 - 1 = 0 => li[j] = li[0] = 5 第二次: j = i - 1 = 1 ===> li[1] = 7
while j >= 0 and tmp < li[j] : # 第一次: 7 < 5 第二次: 4 < 7
li[j+1] = li[j] # li[2] = li[1] = 7 ===> li[2] = 7 [5,7,7,6,3,1,2,9,8] | li[1] = li[0] = 5 [5,5,7,6,3,1,2,9,8]
j = j - 1 # 第二次: j = 0 4 < li[0] === > 4 < 5
li[j+1] = tmp # li[0] = tmp = 4 ==> li[0] = 4 ===> [4,5,6,7,3,1,2,9,8]


# 快速排序
# 时间复杂度: nlogn
# 空间复杂度: O(1)
# [5,7,4,6,3,1,2,9,8]
def patition(li, left, right):
tmp = li[left] # 5
while left < right:
while left < right and tmp <= li[right]:
right = right - 1
li[left] = li[right] # [2,7,4,6,3,1,2,9,8] # [2,1,4,6,3,1,2,9,8]

while left < right and tmp >= li[left]:
left = left + 1
li[right] = li[left] # [2,7,4,6,3,1,7,9,8]
li[left] = tmp
return left


def quick_sort(li, left, right):
if left < right:
mid = patition(li, left, right)
quick_sort(li, left, mid-1)
quick_sort(li, mid+1, right)

@cal_time
def quick(li, left, right):
quick_sort(li, left, right)



def merge(li, left, mid, right):
i = left
j = mid + 1
ltmp = []
while i <= mid and j <= right:
if li[i] < li[j]:
ltmp.append(li[i])
i = i + 1
else:
ltmp.append(li[j])
j = j + 1
while i <= mid:
ltmp.append(li[i])
i = i + 1

while j <= right:
ltmp.append(li[j])
j = j + 1

li[left:right+1] = ltmp

# 归并算法
# 时间复杂度: O(nlogn)
# 空间复杂度: O(n)
def merge_sort(li, left, right):

if left < right:
mid = (left + right) // 2
merge_sort(li, left, mid)
merge_sort(li, mid+1, right)
print('归并之前:', li[left:right+1])
merge(li, left, mid, right)
print('归并之后:', li[left:right+1])

# 计数排序
def count_sort(li):
ltmp = [0 for i in range(11)]

print(ltmp)

for x in li:
ltmp[x] += 1
#ltmp = [0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0]
print(ltmp)
li.clear()
for index, val in enumerate(ltmp):
print(index, val)
for v in range(val):
li.append(index)




li = [10,4,6,3,8,2,5,7]
count_sort(li)
print(li)

# quick_sort(li, 0, len(li)-1)
# print(li)

# li = [1,2,3,4,5,6,7,8,9]

# li = [i for i in range(random.randint(0,10000))]
# li = [random.randint(0,1000) for i in range(100000)]
# quick(li, 0, len(li)-1)
#
# li = [random.randint(0,1000) for i in range(100000)]
# bubble_sort(li)
#
# li = [random.randint(0,1000) for i in range(100000)]
# insert_sort(li)
#
# li = [random.randint(0,1000) for i in range(100000)]
# select_sort(li)

# print(li)









posted @ 2019-01-27 16:50  不沉之月  阅读(143)  评论(0编辑  收藏  举报