算法思想:
- 选择基准值:
- 在待排序的数组中选择一个元素作为基准值,通常选择第一个元素、最后一个元素或中间值。
- 分区操作:
- 重新排列数组,使得所有小于基准值的元素都移到基准值的左边,所有大于基准值的元素都移到基准值的右边。这个操作结束后,基准值就处于其最终排序后的位置。
- 递归排序:
- 递归地将小于基准值的子数组和大于基准值的子数组进行快速排序。
- 合并:
- 因为快速排序是原地排序,所以不需要额外的合并步骤。每个子数组排序完成后,整个数组就变成有序的了。
代码:
class Solution(object):
def quicksort(self, num,left,right):
if left >= right:
return
i = left
j = right
temp = num[i]
while i < j:
while temp <= num[j] and i < j:
j -= 1
num[i]= num[j] # 将小的值放入到i位置上
while temp >= num[i] and i < j:
i += 1
num[j] = num[i] # 将
num[i] = temp # 将基准值放到最后确定的位置上
self.quicksort(num, left, i - 1)
self.quicksort(num, i + 1, right)
num = [21,15,7,99,87]
s = Solution()
s.quicksort(num,0,len(num)-1)
print(num) # [7, 15, 21, 87, 99]
时间复杂度:O(nlogn) 类似树形结构,每一轮都能将数组平均分成两部分,那么递归的深度就是 logn。在每一层,都需要 O(n) 的时间来分割数组。
最坏情况下时间复杂度是:O(n^2)
空间复杂度:O(n) 因为每次递归都会确定一个元素的位置,共开辟n个空间。