defbubble_sort(arr): length = len(arr) for i inrange(length): for j inrange(i, length): if arr[i] > arr[j]: arr[i], arr[j] = arr[j], arr[i] return arr
选择排序
不稳定排序,复杂度$Ο(n ^2)$
1 2 3 4 5 6 7 8 9
defselect_sort(arr): length = len(arr) for i inrange(length): _min = i for j inrange(i+1, length): if arr[_min] > arr[j]: _min = j arr[i], arr[_min] = arr[_min], arr[i] return arr
插入排序
1 2 3 4 5 6 7 8 9 10 11 12
definsert_sort(alist): """插入排序""" n = len(alist) for j inrange(1, n): # 控制将拿到的元素放到前面有序序列中正确位置的过程 for i inrange(j, 0, -1): # 如果比前面的元素小,则往前移动 if alist[i] < alist[i - 1]: alist[i], alist[i - 1] = alist[i - 1], alist[i] # 否则代表比前面的所有元素都小,不需要再移动 else: break
希尔排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14
defshell_sort(alist): """希尔排序""" n = len(alist) gap = n // 2 while gap >= 1: for j inrange(gap, n): i = j while (i - gap) >= 0: if alist[i] < alist[i - gap]: alist[i], alist[i - gap] = alist[i - gap], alist[i] i -= gap else: break gap //= 2
归并排序
稳定排序,复杂度 $Ο(n log n)$ ,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
defmsort2(x): iflen(x) < 2: return x result = [] mid = int(len(x) / 2) y = msort2(x[:mid]) z = msort2(x[mid:]) while (len(y) > 0) and (len(z) > 0): if y[0] > z[0]: result.append(z[0]) z.pop(0) else: result.append(y[0]) y.pop(0) result += y result += z return result
defquicksort(arr): iflen(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [i for i in arr if i<pivot] middle = [i for i in arr if i==pivot] right = [i for i in arr if i>pivot] return quicksort(left) + middle + quicksort(right)
left = 2*root + 1 right = left + 1 larger = root if left < HeapSize and heap[larger] < heap[left]: larger = left if right < HeapSize and heap[larger] < heap[right]: larger = right if larger != root:#如果做了堆调整则larger的值等于左节点或者右节点的,这个时候做对调值操作 heap[larger],heap[root] = heap[root],heap[larger] MAX_Heapify(heap, HeapSize, larger)
defBuild_MAX_Heap(heap):#构造一个堆,将堆中所有数据重新排序 HeapSize = len(heap)#将堆的长度当独拿出来方便 for i in xrange((HeapSize -2)//2,-1,-1):#从后往前出数 MAX_Heapify(heap,HeapSize,i)
defHeapSort(heap):#将根节点取出与最后一位做对调,对前面len-1个节点继续进行对调整过程。 Build_MAX_Heap(heap) for i inrange(len(heap)-1,-1,-1): heap[0],heap[i] = heap[i],heap[0] MAX_Heapify(heap, i, 0) return heap
基数排序
1 2 3 4 5 6 7 8 9
import random defradixSort(): A=[random.randint(1,9999) for i in xrange(10000)] for k in xrange(4): #4轮排序 s=[[] for i in xrange(10)] for i in A: s[i/(10**k)%10].append(i) A=[a for b in s for a in b] return A