快速排序法,这是原地排序
class Solution:
def parttion(self,v, left, right): # //划分
key = v[left]
low = left
high = right
while low < high:
while (low < high) and (v[high] >= key):
high -= 1
v[low] = v[high]
while (low < high) and (v[low] <= key):
low += 1
v[high] = v[low]
v[low] = key # 就是把那个第一个值付给了他,动态的变化。
return low
def quicksort(self,v, left, right):
if left < right:
p = self.parttion(v, left, right) # //选出基数
self.quicksort(v, left, p-1) #//左边快排
self.quicksort(v, p+1, right) #//右边快排
return v
if __name__ == '__main__':
s = [6, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 6]
print("before sort:",s)
solu = Solution()
s1 = solu.quicksort(s, left = 0, right = len(s) - 1)
print("after sort:",s1)
还有一种是重新另外分配2个数组,个人认为简单一点。
以下代码转载 https://blog.csdn.net/weixin_41843918/article/details/88586797
def quick_sort(list1):
# 判断长度
if len(list1) < 1:
return list1
# 取出第一个元素
num = list1[0]
# 遍历第一个元素后面的所有元素,如果比第一个元素小就取出来
start = [x for x in list1[1:] if x <= num]
# 遍历第一个元素后面的所有元素,如果比第一个元素大就取出来
end = [x for x in list1[1:] if x > num]
# 返回值拼接,递归调用,以num为分割点,比它小的在左边,比它大的在右边;
# 停止条件就是第一个判断条件,所有的值都比判别值num大或者小的同时成立时,star、end集合中就没办法取出值,就会结束递归
return quick_sort(start) + [num] + quick_sort(end)