文章目录
https://blog.youkuaiyun.com/xiaoxiaojie12321/article/details/81380834
1. 序言
2.代码(均为升序)
2.1 交换类排序
2.1.1 冒泡排序
每趟遍历中,两两比较,把最大的顶到最后
def maopao(arr):
length = len(arr)
for i in range(length):
for j in range(1,length-i):
if arr[j]<arr[j-1]:
arr[j-1],arr[j] = arr[j],arr[j-1]
print(arr)
2.1.2 快排
快速排序的基本思想:选取一个主元,通过一趟排序将待排记录分隔成独立的三部分,按升序来讲,主元左部分均比主元小,主元右部分均比主元大。
下面代码中选取最后一个元素为主元,然后从左到右遍历实现(和图示不一样)
def sortOne(arr,start,end):
ind = start-1
for i in range(start,end):
if arr[i]<=arr[end]:
ind += 1
arr[ind],arr[i] = arr[i],arr[ind]
ind += 1
arr[ind],arr[end] = arr[end],arr[ind]
return ind
def quickSort(arr,start,end):
if start < end:
mid = sortOne(arr,start,end)
quickSort(arr,mid+1,end)
quickSort(arr,start,mid-1)
2.2 选择排序
2.2.1 简单选择排序
每趟选择最小的放在前面
def xuanpai(arr):
length = len(arr)
for i in range(length):
min_ind = i
for j in range(i+1,length):
if arr[j]<arr[min_ind ]:
min_ind = j
arr[i],arr[min_ind ] = arr[min_ind ],arr[i]
print(arr)
2.2.2 堆排序
堆是一种数据结构,可以把堆看作一棵完全二叉树,若这棵树满足父节点值大于左右子结点值,则为最大堆;若父节点值小于左右子节点值则为最小堆。
完全二叉树特点:可以用一个列表表示完全二叉树,若父节点在列表中的index是 i i i,那么其左子节点若存在则其角标为 2 ∗ i 2*i 2∗i,右子结点若存在则其角标为 2 ∗ i + 1 2*i+1 2∗i+1;若一个节点index为 i i i,那么其父节点index一定为 i / / 2 i//2 i//2
排序(按最大根来实现):先将初始列表按最大堆进行建立,建立后列表中的第一个值最大,那么将其与最后一个数交换,然后对除了最后一个数的列表再进行最大堆操作,然后将操作后的与倒数第二个交换,迭代进行n-1次。
def createMaxDui(arr, low, high):
i,j = low, 2*low #i是父节点,j是左子节点
temp = arr[i]
while j<=high:
if j<high and arr[j]<arr[j+1]: # 若右子结点比左子节点大,那么j指向右子结点
j += 1
if temp<arr[j]:
arr[i] = arr[j] # 右子节点大于原先的父节点,那么将右子节点放到父节点位置上
i = j # 将父节点指针i指向j,继续对改动过的节点向下调整
j = 2*i
else:
break
arr[i] = temp
def duiSort(arr, length):
for i in range(length//2,-1,-1): # 从第length//2 到 0 逐渐建立初始堆
createMaxDui(arr, i, length-1)
for i in range(length-1, 0, -1): # 建立好初始堆后,逐个获取最大值并放到最后
arr[i],arr[0]=arr[0],arr[i]
# 交换后已经破化了最大堆结构,因此对改动后剩下的节点重新建立最大堆
createMaxDui(arr,0,i-1)
2.3 插入排序
2.3.1 直接插入排序
def insert(arr):
length = len(arr)
for i in range(1,length):
temp = arr[i]
j = i-1
while temp < arr[j] and j>=0:
arr[j+1] = arr[j]
j = j-1
arr[j+1] = temp
print(arr)
2.4 归并排序
def sortOne(arr,start,mid,end):
temp_pre = [arr[i] for i in range(start,mid+1)] # 深复制
temp_behind = [arr[i] for i in range(mid+1,end+1)]
i,pre,be = start,0,0
while i < end+1:
if pre==len(temp_pre) or be == len(temp_behind):
if be==len(temp_behind):
arr[i] = temp_pre [pre]
pre += 1
else:
arr[i] = temp_behind [be]
be += 1
else:
if temp_pre[pre]<temp_behind[be]:
arr[i] = temp_pre [pre]
pre += 1
else:
arr[i] = temp_behind [be]
be += 1
i+=1
def mergeSort(arr,start,end):
if start < end:
mid = (start+end)//2
mergeSort(arr,start,mid)
mergeSort(arr,mid+1,end)
sortOne(arr,start,mid,end)