以下排序算法基于Python2.7
冒泡排序:
每次比较相邻的两个元素,比较大小并进行交换,直到排序完成。
def bubblesort(list): for j in xrange(len(list)-1,-1,-1): #推荐使用xrange替代range for i in xrange(j): if list[i]>list[i+1]: list[i],list[i+1] = list[i+1],list[i] return list
或者使用while:
def bubbleSort(list): listLength = len(list) while listLength > 0: for i in range(listLength - 1): if list[i] > list[i+1]: list[i], list[i+1] = list[i+1], list[i] listLength -= 1 return list
快速排序:
先从数列中取出一个数作为基准数,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。再对左右区间重复上面的步骤,直到各区间只有一个数。
def quickSort(list, low, high): i = low j = high if i >= j: return list key = list[i] while i < j: while i < j and list[j] >= key: j = j-1 list[i] = list[j] while i < j and list[i] <= key: i = i+1 list[j] = list[i] list[i] = key quickSort(list, low, i-1) quickSort(list, j+1, high) return list
快速排序还有种简单的写法,三行搞定:
def quickSort(list): if len(list)<=1: return list return quickSort([lt for lt in list[1:] if lt<list[0]]) + list[0:1] + quickSort([ge for ge in list[1:] if ge>=list[0]])
插入排序:
每次遍历从min_index处的值开始,依次再跟后面的值比较,当发现j处比min_index值小时,将min_index赋值为j,继续跟后面的进行比较,直到找到最小的那个j,将j与min_index交换。
def insertSort(list): for i in xrange(len(list)): min_index = i for j in xrange(i+1,len(list)): if list[min_index] > list[j]: min_index = j list[i],list[min_index] = list[min_index], list[i] return list
堆排序:
堆实际上是一棵完全二叉树, 堆排序其实也是一种选择排序,是一种树形选择排序。
def siftDown(list,start,end): root=start while True: child = 2*root+1 if child > end: break if child+1<=end and list[child]<list[child+1]: child+=1 if list[root]<list[child]: list[root],list[child]=list[child],list[root] root=child else: break def heapSort(list): for start in xrange((len(list)-2)/2,-1,-1): siftDown(list,start,len(list)-1) for end in xrange(len(list)-1,0,-1): list[0],list[end]=list[end],list[0] siftDown(list,0,end-1) return list
Python中内置了一个生成堆的模块heapq可以直接调用:
import heapq def heapSort(list): heapq.heapify(list) heap = [] while list: heap.append(heapq.heappop(list)) return heap
打完收功!