#-*- coding: utf-8 -*-
# Wind clear raise
# 2017/7/22 下午4:33
import random
import runtime
@runtime.call_time
def bubble_sort(x):
print(id(x))
for i in range(len(x)-1):
for j in range(len(x) -i - 1):
# 相鄰兩個數相比較
#
if x[j] > x[j+1]:
x[j], x[j+1] = x[j+1], x[j]
@runtime.call_time
def bubble_sort_2(x):
"""冒泡排序優化"""
print(id(x))
for i in range(len(x)-1):
exchange = False
for j in range(len(x) -i - 1):
# 相鄰兩個數相比較
#
if x[j] > x[j+1]:
x[j], x[j+1] = x[j+1], x[j]
exchange = True
if not exchange:
print(exchange)
break
#選擇排序
@runtime.call_time
def select_sort(li):
for i in range(len(li) -1 ):
min_loc = i
for j in range(i+1, len(li)):
if li[j] < li[min_loc]:
min_loc = j
li[i], li[min_loc] = li[min_loc], li[i]
#插入排序
@runtime.call_time
def insert_sort(li):
for i in range(1, len(li)):
tmp = li[i]
j = i - 1
while j >=0 and tmp < li[j]:
li[j+1] = li[j]
j -= 1
li[j+1] = tmp
## 快排
def quick_sort(data, left, right):
if left < right:
mid = partition(data, left, right)
quick_sort(data, left, mid-1)
quick_sort(data, mid + 1, right)
def partition(data, left, right):
tmp = data[left]
while left < right: # left == right 終止
while left < right and data[right] >= tmp:
right -= 1
data[left] = data[right]
while left < right and data[left] <= tmp:
left += 1
data[right] = data[left]
data[left] = tmp
return left
@runtime.call_time
def quick_sort_x(data):
quick_sort(data, 0 , len(data) -1)
#堆
def sift(data, low, high):
i = low
j = 2 * i + 1
tmp = data[i]
while j <= high: # 孩子在堆裏
if j < high and data[j] < data[j+1]: # 若是有右孩子且比左孩子大
j += 1
if tmp < data[j]: # 孩子比根大
data[i] = data[j]
i = j # 新的根
j = 2 * i + 1 # 新的孩子
else:
break
data[i] = tmp
# 降序
def sift_desc(data, low, high):
i = low
j = 2 * i + 1
tmp = data[i]
while j <= high: # 孩子在堆裏
if j < high and data[j] > data[j+1]: # 若是有右孩子且比左孩子小
j += 1
if tmp > data[j]: # 孩子比根小
data[i] = data[j]
i = j # 新的根
j = 2 * i + 1 # 新的孩子
else:
break
data[i] = tmp
@runtime.call_time
def heap_sort(data):
n = len(data)
# print(data)
# 最後一個有子結點的堆 n // 2 -1
for i in range(n // 2 -1, -1, -1):
sift(data, i, n -1)
# 堆建好了。。
# print(data)
for i in range(n -1, -1, -1): # i指向堆的最後
data[0], data[i] = data[i], data[0] # 領導退休,下屬上位
sift(data, 0, i - 1) # 調整新領導
# print(data)
## 歸併
def merge(li, low, mid, high):
i = low
j = mid + 1
ltmp = []
while i <= mid and j<=high:
if li[i] < li[j]:
ltmp.append(li[i])
i += 1
else:
ltmp.append(li[j])
j += 1
while i<= mid:
ltmp.append(li[i])
i += 1
while j<= high:
ltmp.append(li[j])
j += 1
li[low:high+1] = ltmp
def mergesort(li, low, high):
if low < high:
mid = (low + high) // 2
# print(low, high, mid)
mergesort(li, low, mid)
mergesort(li, mid+1, high)
merge(li, low, mid, high)
@runtime.call_time
def mergesort_x(*args):
mergesort(*args)
# 希爾
@runtime.call_time
def shell_sort(li):
gap = len(li) // 2
while gap >0:
for i in range(gap, len(li)):
tmp = li[i]
j = i - gap
while j >= 0 and tmp < li[j]:
li[j+gap] = li[j]
j -= gap
li[j + gap] = tmp
gap //= 2
import copy
data = list(range(10000))
#
random.shuffle(data) # 打亂一個列表
data1 = copy.deepcopy(data)
data2 = copy.deepcopy(data)
data3 = copy.deepcopy(data)
data4 = copy.deepcopy(data)
# data = [1, 5, 3, 7, 8, 9]
# bubble_sort(data)
# random.shuffle(data)
# bubble_sort_2(data)
# print(id(data))
##xxx 1 5 3 7 8 9
## 5 4 8 3 9
# data = [5, 4, 8, 3, 9]
# insert_sort(data2)
# select_sort(data1)
# bubble_sort_2(data4)
# print(data)
print("快排")
quick_sort_x(data3)
# print(data3)
print("堆")
heap_sort(data1)
# 歸併
print("歸併")
mergesort_x(data4, 0, len(data4)-1)
print("shell sort")
shell_sort(data2)
# print(data2)
def topn(li, n=10):
heap = li[0:n]
for i in range(n//2-1, -1, -1):
sift(heap, i, n-1)
for i in range(n, len(li)):
if li[i] > heap[0]:
heap[0] = li[i]
sift(heap, 0, n -1 )
for i in range(n -1, -1, -1):
heap[0], heap[i] = heap[i], heap[0]
sift(heap, 0, i-1)
return heap