#! /usr/bin/python
# coding=utf-8
import random, timeit
times = 10000
def bubble(array):
# o(n*n)
for i in xrange(len(array) - 1):
for j in xrange(len(array) - i):
if array[i] > array[j+i]:
array[j+i], array[i] = array[i], array[j+i]
if times == 1: print array,
def select(array):
"""
Simple Selection Srot
o(n*n)
"""
for i in xrange(len(array) - 1):
min = array[i]
index = 0
for j in xrange(i,len(array)):
if array[j] < min:
min = array[j]
index = j
if index > 0:
array[index], array[i] = array[i], array[index] #减少修改操作
if times == 1: print array,
def insert(array):
"""
Straight Insertion Sort
"""
for i in xrange(len(array) - 1):
if array[i+1] >= array[i]: #如果本身有序这里就直接跳过了
continue
j = i + 1
temp = array[j]
while j > 0 and array[j-1] > temp:
array[j] = array[j - 1]
j -= 1
array[j] = temp
if times == 1: print array,
def shell(array):
"""
希尔排序
让大的序列变成若干小的序列
"""
increment = len(array)
while increment > 1:
increment = increment / 3 + 1
for i in xrange(increment, len(array)):
if array[i] >= array[i - increment]:
continue
j = i
temp = array[i]
while j > 0 and array[j-1] > temp:
array[j] = array[j - 1]
j -= 1
array[j] = temp
if times == 1: print array,
def heap(array):
"""
堆排序
形一个完全二叉树,将最大值移动到根节点
"""
length = len(array)
for x in xrange(0,length / 2):
i = length / 2 - x
_heap(array, i, len(array))
for x in xrange(1,length):
i = length - x + 1
array[0], array[i-1] = array[i-1], array[0]
_heap(array, 1, i - 1)
if times == 1: print array,
def _heap(array, s, length):
#print str(s) + "-" * 10
temp = array[s-1]
j = 2 * s
while j <=length:
if j < length and array[j-1] < array[j]: #如果左边大于右边,将j(指针)指向右边
j +=1
if temp > array[j-1]: #如果顶点已经是最大,退出
break
array[s-1] = array[j-1]
s = j
j *= 2
array[s-1] = temp
def merge(array):
"""
合并排序
"""
_merge(array, 0, len(array))
if times == 1: print array,
def _merge(array, start, end):
if end - start < 2:
return
m = (end - start) / 2
#print start, m, end
left = array[start:start + m]
right = array[start + m:end]
_merge(array, start, start + m)
_merge(array, start + m, end)
_merge2(array, start, start + m, end)
def _merge2(array, start, middle, end):
s,m = start, middle
l = []
while start < m and middle < end:
a,b = array[start], array[middle]
if a < b:
l.append(a)
start += 1
else:
l.append(b)
middle += 1
if start < m:
l += array[start:m]
if middle < end:
l += array[middle:end]
for i in xrange(s,end):
if array[i] != l[i - s]:
array[i] = l[i - s]
def quick(array):
"""
快速排序
"""
_quick(array, 0, len(array) - 1)
if times == 1: print array,
def _quick(array, start, end):
if start >= end:
return
pivot = partition(array, start, end)
_quick(array, start, pivot)
_quick(array, pivot + 1, end)
def partition(array, start, end):
key = array[start]
while start < end:
while start < end and array[end] >= key:
end -= 1
array[start], array[end] = array[end], array[start]
while start < end and array[start] <= key:
start += 1
array[start], array[end] = array[end], array[start]
return end
if __name__ == '__main__':
array = [random.randint(1,100) for i in xrange(100)]
print array
from timeit import Timer
print "bubble",Timer(lambda: bubble(array[:])).timeit(number=times)
print "select", Timer(lambda: select(array[:])).timeit(number=times)
print "insert", Timer(lambda: insert(array[:])).timeit(number=times)
print "shell", Timer(lambda: shell(array[:])).timeit(number=times)
print "heap", Timer(lambda: heap(array[:])).timeit(number=times)
print "merge", Timer(lambda: merge(array[:])).timeit(number=times)
print "quick", Timer(lambda: quick(array[:])).timeit(number=times)
print "sorted", Timer(lambda: sorted(array[:])).timeit(number=times)