python 排序算法
一、冒泡排序
两层for循环,内循环比较当前数与下一位的大小,如小,交换位置。
1 def bubble_sort(data): 2 for i in range(len(data)-1): 3 for j in range(len(data)- i -1): 4 if data[j]<data[j + 1]: 5 data[j], data[j + 1] = data[j + 1], data[j]
二、插入排序
循环有序数列后的每一位数,如果大于有序数列的最后一位,则两数交换位置,再与有序数列的最后第二位比较,以此类推。
1 def insect_sort(data): 2 for i in range(1, len(data)): 3 tmp = data[i] 4 j = i - 1 5 while j>=0 and data[j] > tmp: 6 data[j],data[j + 1] = data[j + 1],data[j] 7 j -= 1 8 data[j + 1] = tmp
三、选择排序
每次for循环都找出最小的数,作为该次循环的结果
1 def select_sort(data): 2 for i in range(len(data)-1): 3 min_num = i 4 for j in range(i+1, len(data)): 5 if data[j]<data[i]: 6 min_num = j 7 data[i], data[min_num] = data[min_num], data[i]
四、快排
选第一个数,从左开始循环比较,如小于,停止循环,将小的数放至第一个数位置,从右开始循环,如大于,停止循环,将大的数放到上次循环空位上,如此循环直到left = right,返回mid,进行递归
1 def quick_sort(data,left,right): 2 if left<right: 3 mid = partition(data,left,right): 4 quick_sort(data,left,mid-1) 5 quick_sort(data,mid+1,right) 6 7 def partition(data,left,right): 8 tmp = data[left] 9 while left < right: 10 while left < right and data[right]>=tmp: 11 right -= 1 12 data[left] = data[right] 13 while left < right and data[left]<=tmp: 14 left += 1 15 data[right] = data [left] 16 data[left] = tmp 17 return left
五、堆排序
先从最小的有子节点的父节点开始循环调整建堆,然后取数,将堆末与堆顶换位,再进行一次除开已换下位的堆顶的调整,如此循环。
def sift(data,low,high): i = low j = 2*i + 1 tmp = data[i] while j <= high: # 只要没到最后根最后 if j < high and data[j] < data[j + 1]: # 是否有右孩子,且右孩子大于左孩子 j = j + 1 # j 成为最大孩子的下标 if tmp < data[j]: # 最大的孩子是否大于父亲 data[i] = data[j] # 子孩子上位 i = j # 重新赋值下标 j = 2*i + 1 else: # 上述条件都不满足,跳出循环 break data[i] = tmp def heap_sort(data): n = len(data) for i in range(n // 2 -1 ,-1,-1): sift(data,i,n-1) for i in range(n-1,-1,-1): data[0],data[i] = data[i],data[0] sift(data,0,i-1)
进一寸有进一寸的欢喜。