Python 排序算法
19 Sep 2012Python暑假玩了段时间,没怎么写过东西,加上算法好久没看,复习一下。
先看个好玩的视频:各个算法的声音
平均时间复杂度均为O(n^2):插入,冒泡,选择
Insert Sort
def insert_sort(list): length = len(list) if length < 2: return list for i in range(1,length): num = list[i] j = i - 1 while j>=0 and list[j]>num: list[j+1] = list[j] j-=1 list[j+1] = num return list
Bubble Sort
def bubble_sort(list): length = len(list) if length < 2: return list for i in range(length-1): for j in range(length-i-1): if list[j] > list[j+1]: list[j],list[j+1]=list[j+1],list[j] return list
Selection Sort
def selection_sort(list): length = len(list) if length < 2: return list for i in range(length-1): smallest = list[i] location = i for j in range(i,length): if list[j] < smallest: smallest = list[j] location = j if i!=location: list[i],list[location] = list[location],list[i] return list
平均时间复杂度为O(nlogn)的算法:归并排序,堆排序和快速排序
Merge Sort
class merge_sort(object): def _merge(self, alist, p, q, r): left = alist[p:q+1] right = alist[q+1:r+1] for i in range(p,r+1): if len(left)>0 and len(right)>0: if left[0]<=right[0] alist[i] = left.pop(0) else: alist[i] = right.pop(0) elif len(right)==0: alist[i] = left.pop(0) elif len(left)==0: alist[i] = right.pop(0) def _merge_sort(self, alist, p, r): if p<r: q = int((p+r)/2) self._merge_sort(alist, p, q) self._merge_sort(alist, q+1, r) self._merge(alist, p, q, r) def __call__(self, list): self._merge_sort(list, 0, len(list)-1) return list
HeapSort
def heap_sort(list): build_heap(list) length = len(list) for i in reversed(range(1, length)): list[0],list[i] = list[i],list[0] heapify(list, 0, i - 1) def build_heap(list): length = len(list) for i in reversed(range(0, (length - 1) / 2)): heapify(list, i, length - 1) def heapify(list, low, high): left = low * 2 + 1 right = left + 1 current = low tmp = list[low] while left <= high: if right <= high: if list[left] < list[right]: next = right else: next = left else: next = left if tmp < list[next]: list[current] = list[next] current = next left = current * 2 + 1 right = left + 1 else: break list[current] = tmp
QuickSort
class quick_sort(object): def _partition(self, alist, p, r): i = p-1 x = alist[r] for j in range(p, r): if alist[j]<=x: i += 1 alist[i], alist[j] = alist[j], alist[i] alist[i+1], alist[r] = alist[r], alist[i+1] return i+1 def _quicksort(self, alist, p, r): if p<r: q = self._partition(alist, p, r) self._quicksort(alist, p, q-1) self._quicksort(alist, q+1, r) def __call__(self, list): self._quicksort(list, 0, len(list)-1) return list
平均时间复杂度为O(N*(logN)2)的:希尔
ShellSort
def shell_sort(list): increment = 50 while increment > 1: increment = increment / 3 + 1 shell_pass(list, increment) print "increment:", increment, ", list:", list def shell_pass(list, increment): length = len(list) for i in range(increment, length): tmp = list[i] k = i while k >= increment and list[k - increment] > tmp: list[k] = list[k - increment] k -= increment list[k] = tmp
转载请注明:于哲的博客 » Python 排序算法