悉野小楼

导航

快速排序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.一般以最左边为基点, 元素复制出去用作比较用, 最左边的位置就空着了, 然后从右边开始向左遍历, 比基点小的放到坑里面, 右边原来的位置就空出来了, 变成坑, 这时可以从左向右遍历, 找到比基点大的放到这个坑里面, 也叫挖坑法.

也可以新开一个一样大数组, 比基点小的放从最左边开始放, 比基点大的从右边开始放(多用内存, 直观理解)

posted on 2024-08-29 23:44  悉野  阅读(2)  评论(0编辑  收藏  举报