算法思想
可参考:快速排序
快速排序也是用的分治递归的思想,但是相比归并不需要额外的空间复杂度,空间复杂度为O(1)
首先选取一个基准值,然后比较数组剩余元素与基准值的大小,比基准值小的放在基准值的左边,比基准值大的放在基准值的右边。
依次类推,递归进行每次划分后的数组。
- 选择索引first处的值为基准值
- 通过从左到右扫描与从右到左扫描,left是左扫描位置,right是右扫描位置,找到左边第一个大于基准值的位置与右边第一个小于基准值的位置
- 然后将这两个值交换,并将left向右移动,right向左移动,继续重复进行
- 直到left>right,也就是全部扫描一遍后,将基准值s[b]与最后的left位置交换,这样就完成了分割
- 然后再进行递归调用两个序列
算法实现
'''
快速排序
'''
# 使用三个数组分别保存比基准值小的,与基准值相等的,比基准值大的三种类型的数
def quickSort1(array):
n = len(array)
if n <= 1:
return array
mid = []
low = []
high = []
base = array[0]
for i in range(n):
if array[i] < base:
low.append(array[i])
elif array[i] == base:
mid.append(array[i])
else:
high.append(array[i])
lowArr = quickSort1(low)
highArr = quickSort1(high)
res = lowArr + mid + highArr
return res
def quickSort(array, first, last):
if first >= last:
return array
# 基准值,用于将数组划分为两部分,比基准值大的右侧,和比基准值小的左侧
base = array[first]
# 定义两个指针分别指向数组的最左第一个和最右第一个
left = first
right = last
# 两个指针不相等时,执行循环体内过程
while left < right:
# 从右往左,放比基准最大的数,如果满足,只需将指针向前移动
while left < right and base <= array[right]:
right -= 1
# 遇到比基准值小的,将右指针所指的数放在左指针所指的位置
array[left] = array[right]
# 从左往右,放比基准值小的数,如果满足,只需将指针向后移动
while left < right and array[left] <= base:
left += 1
# 遇到比基准值大的,将左指针所指的数放在右指针所指的位置
array[right] = array[left]
# 最后将基准值添加到一趟划分好的两数组的中间,此时,左右两个指针相等,所以基准值放在哪个指针下都可以
array[right] = base
# 递归对左右两个数组进行快排,这时前一趟循环的基准值将不算入其中
self.quickSort(array, first, left-1)
self.quickSort(array, left+1, last)
return array
if __name__ == '__main__':
array = [14, 33, 6, 27, 10, 35, 19, 42, 44]
array_quick = s.quickSort(array, 0, len(array)-1)
print('快速排序:', array_quick)