参考:https://www.cnblogs.com/onepixel/articles/7674659.html
快速排序(Quick Sort)
时间复杂度(平均): O(nlog2 n) 时间复杂度(最坏):O(n^2) 时间复杂度(最好):O(nlog2 n) 空间复杂度:O(n) 稳定性:不稳定
算法描述
快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
- 从数列中挑出一个元素,称为 “基准”(pivot);
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
代码
'''
快速排序(Quick Sort)
采用递归, 结束条件, nums 长度小于等于1,返回nums, 否则, 从第二个元素开始跟第一个元素比较, 大于则不处理, 小于则向前替换至第一个大于首位元素的前面;
之后将首位元素移动到小于首位的元素的后面
然后递归对小于首位元素的数组和大于首位元素的数组进行快速排序
原理:依次定位首位元素的位置
时间复杂度(平均): O(nlog2 n) 时间复杂度(最坏):O(n^2) 时间复杂度(最好):O(nlog2 n) 空间复杂度:O(n) 稳定性:不稳定
'''
def sort(nums):
if len(nums) < 2:
return nums
current_value = nums[0]
max_start = 1
for i in range(1, len(nums), 1):
if nums[i] >= current_value:
continue
if nums[i] < current_value:
temp = nums[i]
j = i
while j > max_start:
nums[j] = nums[j - 1]
j -= 1
nums[j] = temp
max_start += 1
k = 1
while k < max_start:
nums[k - 1] = nums[k]
k += 1
nums[k - 1] = current_value
left = sort(nums[:k-1])
right = sort(nums[k:])
return left + [nums[k-1]] + right