|
基本排序算法,包括冒泡排序,插入排序,选择排序,堆排序,快速排序等。
【冒泡排序】
复杂度是n*n
#coding:utf8
#author:HaxtraZ
#description:冒泡排序
def bubblesort1(a):
#每次找到一个最小元素,放到数组首部
n=len(a)
for i in range(0,n-1):
swapped=False
for j in range(n-1,i,-1):
if a[j]a[j+1]:
a[j],a[j+1]=a[j+1],a[j]
swapped=True
if not swapped: break
def bubblesort3(a):
#这个版本来自维基百科
#外层循环本来有点问题的,如果是range(len(a)-1,1,-1)
#那么当输入数据为3,5,1时,结果不正确
#当然,维基百科上这个错误我已经修改过了。
for j in range(len(a)-1, 0, -1):
for i in range(0, j):
if a>a[i+1]:
a,a[i+1]=a[i+1],a
【插入排序】
复杂度是n*n
#coding:utf8
#author:HaxtraZ
def insertion_sort1(a):
#线性插入排序
for j in range(1, len(a)):
key = a[j]
i = j - 1
while i>=0 and a>key:
a[i+1] = a
i = i-1
a[i+1] = key
def binInsertSort(a):
#二分插入排序
n = len(a)
for j in range(1, n):
key = a[j]
i = j - 1
if key > a:
continue
l, r = 0, i
while l l:
a[k] = a[k - 1]
k = k - 1
a[l] = key
【选择排序】
复杂度是n*n
#coding:utf8
#author:HaxtraZ
#description:选择排序
def selectsort1(a):
#每次找最小元素
n=len(a)
for i in range(0, n-1):
for j in range(i+1, n):
minpos=i #minpos用于记录最小元素的下标
if a[j]a[maxpos]:
maxpos=j
if maxpos!=i:
a,a[maxpos]=a[maxpos],a
【堆排序】
复杂度是nlogn
#coding:utf8
#author:HaxtraZ
#description:堆排序
#修改自《算法导论》2nd Edition
def LEFT(i):
return 2*i+1
def RIGHT(i):
return 2*i+2
def PARENT(i):
return (i-1)/2
def MAX_HEAPIFY(a,i,heapsize):
l=LEFT(i)
r=RIGHT(i)
if la:
largest=l
else:
largest=i
if ra[largest]:
largest=r
if largest!=i:
a,a[largest]=a[largest],a
MAX_HEAPIFY(a,largest,heapsize)
def BUILD_MAX_HEAP(a):
heapsize=len(a)
i=PARENT(len(a)-1)
while i>=0:
MAX_HEAPIFY(a,i,heapsize)
i -= 1
def HEAP_SORT(a):
BUILD_MAX_HEAP(a)
n=len(a)
heapsize=n
for i in range(n-1, 0, -1):
a[0],a=a,a[0]
heapsize-=1
MAX_HEAPIFY(a,0,heapsize)
a=[1,3,2,4,8,6,22,9]
HEAP_SORT(a)
print a
【快速排序】
复杂度是nlogn
#coding:utf8
#version1
'''参考自http://interactivepython.org/courselib/static/pythonds/SortSearch/sorting.html'''
def quickSort(alist):
quickSortHelper(alist,0,len(alist)-1)
def quickSortHelper(alist,first,last):
if first |
|