defbubbleSort(arr): for i inrange(len(arr)-1, 0, -1): flag = True for j inrange(0, i): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] flag = False if flag: break return arr
每次起泡将最大的元素放到末尾,加速方法是判断一次起泡后是否有变换,如果没有变化则终止。
选择排序
1 2 3 4 5 6 7 8 9
defselectionSort(arr): for i inrange(len(arr)-1): minIndex = i for j inrange(i, len(arr)): if arr[minIndex] > arr[j]: arr[minIndex], arr[j] = arr[j], arr[minIndex] if i != minIndex: arr[minIndex], arr[i] = arr[i], arr[minIndex] return arr
每次选择最小的元素放到未排序数组的左边,注定要走完全程。
插入排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14
definsertSort(arr): ifnot arr: return [] res = [arr[0]] for i inrange(1, len(arr)): p = arr[i] for pos inrange(i-1, -1, -1): if p > res[pos]: break if p > res[0]: res.insert(pos+1, p) else: res.insert(0, p) return res
每次将未排序的元素插入到已经排好序的数组中。这里偷懒开了空间,同时用了insert()函数插入。
希尔排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
defshellSort(arr): ifnot arr: return [] gap = 1 while(gap < len(arr)/2): gap = gap*2+1 while gap > 0: for i inrange(gap, len(arr)): temp = arr[i] j = i-gap while j >= 0and arr[j] > temp: # insert sort arr[j+gap] = arr[j] j -= gap arr[j+gap] = temp gap = gap//2 return arr