每一次写快排都会出现很多问题,我也是很郁闷······
总结一下,顺便看一下这次会不会顺利一些😜
def quick_sort(a,lo,hi):
if lo < hi:
tag = partition(a,lo,hi)
quick_sort(a,lo,tag-1)
quick_sort(a,tag+1,hi)
return a
def partition(a,lo,hi):
i = lo
j = hi
temp = a[lo]
while i < j:
while i <j and a[j] >= temp:
j -= 1
while i< j and a[i] <= temp:
i += 1
a[j],a[i] = a[i],a[j]
a[i],a[lo] = a[lo],a[i]
return i
遇见的错误
def quick_sort(a)
def partition(a)
想要之传入一个参数,所以中间用了quick_sort(a[lo:mid+1])
测试用例后发现并没有进行排序,debug后找到错误:list切片后产生的是一个新对象,对新对象进行排序,不会对原对象产生作用。ps:我的归并排序写的时候也是用了切片所以这边有点混乱,回看了我的归并才发现归并返回的是 return merge(left,right)
返回的是一个新数组,而测试用例的时候是 print merge_sort(a)
a[j] >= temp
这里要是大于等于,两个指针时一定要找到大于或者小于的那个数的。如果没有等于的话,遇见数组中有相同的值得时候会出现问题
while i < j
这个条件有一次写的时候就没有写,导致出来的结果肯定不对啦,找了半天。还是快排的原理有些混乱。不加这个条件,只能找到一对比temp值小的数然后进行交换。而快排的一次排序过程是要使得i
前面的数都比i
小,后面的都比i
大
ps:事实证明并不顺利,不是缺这个就缺那个,什么时候才能徒手写一点都没错啊啊啊啊啊