一.冒泡排序
算法描述:冒泡排序分为内循环和外循环,外循环是排序轮次,特点是每一次排序都会将最大的排在最后,内循环是每一轮排序需要排序的元素个数,所以时间复杂度是O(n^2)
def Bubble(arr):
#外层控制遍历次数,因为每一次会把最大的数排在最后,最后一次不用排序所以遍历len(arr)-1次
for i in range(len(arr)-1):
# 内层控制每次遍历时未排序的元素索引,外层循环一次后,内部需要排序的元素就少一个,所以循环len(arr)-i-1次
for j in range(0,len(arr)-i-1):
if arr[j]>arr[j+1]:
arr[j],arr[j+1] = arr[j+1],arr[j] # 当前一个比后一个数大,交换他们的位置
return arr
print(Bubble([2,5,1,6,7]))
二.选择排序
算法描述:以第一个数为基准,找到剩下的数中最小的数和它比较,若小则交换,若第一个数已是最小,则再已第2个数为基准比较,遍历所有元素,最后一个元素不用比较,所以外层循环是比较的轮次,内层循环是从基准数进行向后遍历,若是后面的数比他小,则将后面的数记作较小的数,一步步比较,直到比较到最后一个数则可判断出最小的数,一个轮次比较完毕。
时间复杂度为O(n^2)
def select(nums):
for i in range(len(nums)-1): #定义外层循环为循环轮次
min_index = i
for j in range(i,len(nums)): #定义内层循环从i开始到结束,为比较次数
if nums[min_index]>nums[j]:
min_index = j
if min_index!=i: #如果i之后有比nums[i]更小的数,则交换两数位置
nums[i],nums[min_index] = nums[min_index],nums[i]
return nums
print(select([4,2,3,1,9,6,7]))
三.快速排序
算法描述:
采用双指针,递归和分治思想解决的
一般采用第一个数是基准数,指定左起始点和右起始点,右起始点向左遍历,找到比基准数小的停下,左起始点向右遍历,找到比基准数大的停下,若此时左起始点和右起始点未重合,则交换左起始点和右起始点的数,再进行左右移动,直到重合,交换基准数和重合点的数,此时基准数左边都是比他小的数,右边都是比他大的数,第一次排序完成,再递归对它左边和右边的数进行排序。
快排的时间复杂度为O(nlogn)
def partition(arr,l,r):
i = l
j = r
ini=arr[l]
while i != j: #左右指针没重合
while i < j and arr[j]>ini:
j-=1
while i < j and arr[i]<=ini:
i+=1
if i<j:
arr[i],arr[j] = arr[j],arr[i]
arr[l],arr[j] = arr[j],arr[l]
return i
def quick_sort(arr,l,r):
if l>=r:
return
index = partition(arr,l,r) # 第一次排序返回的中间坐标
quick_sort(arr,l,index-1) # 递归执行左边的
quick_sort(arr, index+1, r) # 递归执行右边的
return arr
print(quick_sort([2,8,1,5,4],0,4))