【常见排序算法】
1.快速排序
【快速排序思路】
1.取一个元素p(第一个元素),使元素p归位;
2.列表被p分成两个部分,左边都比p小,右边都比p大;
3.递归完成排序
【快速排序流程】
一、首先创建一个P归位函数
步骤思路
1.将第一个元素5存起来 tmp=li[left]
2.开始循环,left=right结束循环
3.从右边找一个比五小的数放在5的下标,当左右下标碰到,则推出循环
4.再从左边找一个比五大的数放在刚才的空缺下标。 当左右下标碰到,则推出循环
以此类推
【运行代码】
#快速排序取mid值函数
def partition(li,left,right):
tmp=li[left] #先将左边元素存储,空出li[left]
while right>left: #当左右相等,推出循环
#从右往左找比tmp小的数
while left<right and li[right]>=tmp:
right-=1 #没找到就减一
li[left]=li[right] #将找到的数存到空出来的左下标
#从左往右找比tmp大的数
while left<right and li[left]<=tmp:
left+=1
li[right]=li[left]
print(li)
li[right]=tmp #最后将mid值存入进来
print(li)
li=[3,2,1,5,4,7,0]
print(li)
partition(li,0,len(li)-1)
【运行结果】
[3, 2, 1, 5, 4, 7, 0] #引入列表
[0, 2, 1, 5, 4, 7, 5] #将右边的0存入3的位置,将左边的5存入0的位置
[0, 2, 1, 5, 4, 7, 5]#此时左右下标重合
[0, 2, 1, 3, 4, 7, 5] #将重合下标改为tmp
【编写快速排序】
#快速排序取mid值函数
def partition(li,left,right):#列表、左下标、右下标
tmp=li[left] #先将左边元素存储,空出li[left]
while right>left: #当左右相等,推出循环
#从右往左找比tmp小的数
while left<right and li[right]>=tmp:
right-=1 #没找到就减一
li[left]=li[right] #将找到的数存到空出来的左下标
#从左往右找比tmp大的数
while left<right and li[left]<=tmp:
left+=1
li[right]=li[left]
li[right]=tmp #最后将mid值存入进来
return right
#快速排序框架
def quick_sort(data,left,right):#列表、左下标、右下标
if left<right:
mid = partition(data,left,right) #归位完中间值
quick_sort(data,left,mid-1)#继续递归左边的列表
quick_sort(data,mid+1,right)#右边的列表
li=[3,2,1,5,4,7,0]
quick_sort(li,0,len(li)-1)
print(li) #[0, 1, 2, 3, 4, 5, 7]
【快速排序的效率】
快速排序的时间复杂度:O(nlogn) 每次递归被分成两个所以是O(logn),partition函数的复杂度是O(n)——因为从左开始撞到右,从右开始碰到左,只要循环n次就好
【快速排序的问题】
1.最坏情况 【9,8,7,6,5,4,3,2,1】倒序 速度是O[n^2]
2.递归