definsertion_sort(a):for i inrange(1,len(a)):for j inrange(0, i):if a[i]<a[j]:
a[i], a[j]= a[j], a[i]return a
definsertion_sort2(a):for i inrange(1,len(a)):
tmp = a[i]for j inrange(0, i):if a[i]<a[j]:del a[i]#先删除后排序
a.insert(j, tmp)breakreturn a
快速排序 快排以基数为基准进行交换使排序成为不稳定的。
#递归版defquick_sort(a, left, right):ifnot a or left<0or right<=0or left>=right:#left>=right:只有一个数的时候没必要再分割比较return
i = left
j = right
mid = a[left]while(i!=j):while(i<j and a[j]>mid):#右边先动,保证相遇时的数比基数小
j -=1while(i<j and a[i]<=mid):
i +=1if(i<j):
a[i], a[j]= a[j], a[i]
a[left], a[i]= a[i], a[left]
quick_sort(a, left, i-1)
quick_sort(a, i+1, right)return a
#非递归版defquick_sort(a, left, right):ifnot a or left<0or right<=0or left>=right:return a
temp =[]
temp.append(right)
temp.append(left)while(temp):
i = temp.pop()
j = temp.pop()if(i<j):
mid = a[i]
left = i
right = j
while(left!=right):while(left<right and a[right]>mid):
right -=1while(left<right and a[left]<=mid):
left +=1if(left<right):
a[right], a[left]= a[left], a[right]
a[i], a[right]= a[right], a[i]if(right>i):
temp.append(right-1)
temp.append(i)if(j>right):
temp.append(j)
temp.append(right+1)return a
归并排序 归并算法需要两两比较,不存在跳跃,因此归并排序是一种稳定的排序算法。
#递归版defmerge_sort(a):iflen(a)<=1:return a
mid =len(a)//2
left = merge_sort(a[:mid])
right = merge_sort(a[mid:])
temp =[]
i=j=0while(i<len(left)and j<len(right)):if left[i]<right[j]:
temp.append(left[i])
i +=1else:
temp.append(right[j])
j +=1if i<len(left):
temp += left[i:]elif j<len(right):
temp += right[j:]return temp
#非递归版(效率比较低)defmerge_sort(a):for i in[2**j for j inrange(len(a))if2**j<=len(a)]:#步长以2的指数增长print(i)
index =0while(index+2*i<=len(a)):
index +=2*i
merge(a, index-2*i, index-i, index)if index+i<len(a):#对剩余部分排序
merge(a, index, index+i,len(a))return a
defmerge(a, left, mid, right):
i = left
j = mid
temp =[]while(i<mid and j<right):if a[i]<a[j]:
temp.append(a[i])
i +=1else:
temp.append(a[j])
j +=1if i<mid:
temp += a[i:mid]elif j<right:
temp += a[j:right]for j,i inenumerate(range(left, right)):#只能先保存后一个个替换
a[i]= temp[j]return
二叉树排序 先利用待排序数组构建二叉搜索树,再利用中序遍历对数据进行排序
classNode():def__init__(self, x):
self.val = x
self.left =None
self.right =NoneclassTree():def__init__(self):
self.root =Nonedefsort_tree(self, x):
node = Node(x)ifnot self.root:
self.root = node
return
p = self.root
whileTrue:if x<=p.val:ifnot p.left:
p.left = node
return
p = p.left
elif x>p.val:ifnot p.right:
p.right = node
return
p = p.right
definorder(self, root):ifnot root:return[]
left = self.inorder(root.left)
res =[root.val]
right = self.inorder(root.right)return left+res+right