#快速排序
def QuikSort(myList,start,end):
if start<end: #这个不要忘记了,必须有这个,这个防止只有一个元素之类的
i,j=start,end
base=myList[i]
while i<j: #这个不要忘记,否则这个就不会一直循环下去了,也就是i和j有可能会出现不相等的情况
while (i<j) and (myList[j]>base): #在这的时候,不要忘记i<j的情况
j=j-1
myList[i]=myList[j]
while (i<j) and (myList[i]<=base):
i=i+1
myList[j]=myList[i]
myList[i] = base #只有在while循环完成之后,才会有这个的赋值
QuikSort(myList,start,i-1) #这个也都是在ifi<j里面去做的
QuikSort(myList,j+1,end)
return myList
快速排序的思想是:选取最左边的一个数值存在base变量里面,从最右边向最左边进行比较遍历,如果比base大,那么不管,如果myList[j]比base小,那么将这个位置的myList[j]复制给myList[i],因为i刚开始是从最左边开始的,而且它本身的这个数值是被base变量保存着呢,所以不会被遗漏。接着几次循环,就可以把base放在合适的位置,要注意while等的是如何的包含嵌套关系
这个最后返回的是原始的数组,所以后面应该是还需要输入他的起始位置。否则,最后应该怎么返回那个数组呢。
在leetcode里面以类的形式出现
class Solution(object):
def sortArray(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
start = 0
end = len(nums) - 1
return self.sort_quick(nums, start, end)
def sort_quick(self, array, start, end): #如果在这进行缩进的话,也就是在def sortArray #里面的话,也就不需要再进行写入self了,因为这样不属于他的一个方法
if start < end:
i = start
j = end
label = array[i]
while i < j:
while array[j] > label and i < j:
j = j - 1
array[i] = array[j]
while array[i] <= label and i < j:
i = i + 1
array[j] = array[i]
array[i] = label
self.sort_quick(array, start, i - 1)
self.sort_quick(array, j + 1, end)
return array