快速排序python实现
def quick_sort(arr, left, right): origin_left = left origin_right = right pivot_data = arr[left] #枢轴上的值(基准值), 就是开始用来比较的值, 一般是随机选择一个位置, 这儿选择最左边的值 #blank_pos = left # 最左边的值已经复制到pivot中了, 所以这块内存可以使用, 作为空缺位置 初始left指向的位置就是个可以使用的空位 left_to_right = False #当前是否从左向右移动指针(初始最空缺在最左边, 所以从右向左遍历) while(left != right): if left_to_right: # 从左向右 if arr[left] > pivot_data: arr[right] = arr[left] right -= 1 left_to_right = False else: # 继续右移 left += 1 else: # 从右向左 # 如果小于基准值, 放左到边去 if arr[right] < pivot_data: arr[left] = arr[right] # right位置的值复制给了left位置, right位置可以看成空位, 后面比pivot_data大的值, 可以放到这个位置 left += 1 left_to_right = True else: right -= 1 # 左右两个重叠就是基准值的位置 arr[left] = pivot_data print(arr) if left - origin_left > 1: quick_sort(arr, origin_left, left - 1) if origin_right - left > 1: quick_sort(arr, left + 1, origin_right) test_arr = [3,5,2,1,6,7,9,4] quick_sort(test_arr, 0, len(test_arr) - 1) print(test_arr)
1.随机一个基点, 遍历全数组, 比基点大的放左边, 比基点小的放右边. 以基点为分隔左右两边再递归调用同样处理.
2.一般以最左边为基点, 元素复制出去用作比较用, 最左边的位置就空着了, 然后从右边开始向左遍历, 比基点小的放到坑里面, 右边原来的位置就空出来了, 变成坑, 这时可以从左向右遍历, 找到比基点大的放到这个坑里面, 也叫挖坑法.
也可以新开一个一样大数组, 比基点小的放从最左边开始放, 比基点大的从右边开始放(多用内存, 直观理解)