Python3实现快速排序
快速排序 是一种交换排序,属于分治算法。
思路:
对于要排序的元素集合,指定集合的第一个元素为基准点,通过一系列的扫描和交换(见下面的代码),让基准点左边的元素比基准点小,让基准点右边的元素比基准点大,这样分成了以基准点为界的左右两个子集合,对于每个子集合递归地重复上述步骤,直到每个最小集合只有一个元素时,就说明每个最小子问题解决完成,从而总问题解决完成。
代码:
# 快速排序 arr要排序的元素总集,left要排序的最左索引,right要排序的最右索引
def kp(arr, left, right):old_left = leftold_right = rightif left >= right:returnbase = arr[left] # 指定left为基准点,存储基准值toLeft = True # 扫描方向while left < right: # 只要left < right,就一直扫描;扫描的结束条件是left和right重合if toLeft: # 从右向左扫描:若找到比base小的,则把值赋给left处,然后left+1,扫描方向变为向右;否则继续向左扫描(right - 1)if arr[right] < base:arr[left] = arr[right]toLeft = False # 反转扫描方向left += 1else:right -= 1else: # 从左向右扫描:若找到比base大的,则把值赋给right,然后right-1,扫描方向变为向左;否则继续向右扫描(left + 1)if arr[left] > base:arr[right] = arr[left]toLeft = True # 反转扫描方向right -= 1else:left += 1arr[left] = base # 把记录的基准值赋值在left和right重合处# 继续对左右2个子问题进行递归求解,看,这就是分治算法思想(子问题相互独立不重合)kp(arr, old_left, left - 1)kp(arr, left + 1, old_right)if __name__ == '__main__':arr = [5, 6, 3, 1, 7, 8, 19, 4, 88, -2]kp(arr, 0, len(arr) - 1)print(arr)