1.选择排序
#选择排序
#每次找出一个最小值
def SelectSort(lst):
n = len(lst)
for i in range(n):
valueI = lst[i]
for j in range(i+1,n):
tmp2 = lst[j]
if valueI > tmp2:
lst[i],lst[j] = tmp2,valueI
valueI = tmp2
return lst
2.冒泡排序
#冒泡排序
#每次通过比较相邻两点的值,如果右边比左边小,则交换两者的位置,
#每轮可选出一个参与排序的最大值
def BubbleSort(lst):
n = len(lst)
for i in range(n):
for j in range(0,n-i-1):
if(lst[j]>lst[j+1]):
lst[j],lst[j+1] = lst[j+1],lst[j]
return lst
#冒泡排序有一处可优化的地方
#当某轮排序不发生交换时,说明序列已有序,即可推出排序
def BubbleSort(lst):
n = len(lst)
for i in range(n):
flag = False
for j in range(0,n-i-1):
if(lst[j]>lst[j+1]):
flag = True
lst[j],lst[j+1] = lst[j+1],lst[j]
if flag == False:
break
return lst
3.快速排序
#快速排序
#采用分治的方法,选择lst[0]作为中间点,将大于lst[0]的换到右边,小于lst0]的换到左边,递归
import numpy as np
lst = list(np.random.randint(1000,size=100000))
def QuickSort(lst):
n = len(lst)
if n <= 1:
return lst
midValue = lst[0]
leftIdx = 1
rightIdx = n-1
while(leftIdx != rightIdx):
#右端点小于lst[0]则在从左端点出发,直接找到一个大于lst[0]的点,两点互换,来实现左侧都小
#于右侧
if (lst[rightIdx] <= midValue):
if (lst[leftIdx]<=midValue):
leftIdx += 1
else:
lst[leftIdx],lst[rightIdx] = lst[rightIdx],lst[leftIdx]
rightIdx -= 1
else:
rightIdx -= 1
if (lst[leftIdx]<=midValue):
return QuickSort(lst[1:leftIdx+1])+ [midValue] + QuickSort(lst[leftIdx+1:])
else:
return QuickSort(lst[1:leftIdx])+ [midValue] + QuickSort(lst[leftIdx:])