关于随机化的快速排序的问题,我添加了随机化之后,排序就乱了,不知道可不可以请老师帮忙看一下

来源:3-6 随机化快速排序法

不务正业的码农

2018-08-22

添加了随机化之后,排序结果就乱了,我自己调试了一下,没发现逻辑错误在哪,不知道可不可以请老师帮忙看一下。

代码是用Python3实现的

import random
#随机选定Pivot值的改进版本快排

def quick_sort1(arr,n):
    """
    @param arr: 待排序数组
    @param n: 待排序数组长度
    """
    __quick_sort(arr,0,n-1)

def __quick_sort(arr,l,r):
    """
    @param arr:待排序数组
    @param l:左边界
    @param r:右边界
    """
    #递归边界
    if l >= r:
    return 
    p = __partrition(arr,l,r)
    __quick_sort(arr,l,p-1)
    __quick_sort(arr,p+1,r)

def __partrition(arr,l,r):
    """
    @param arr:待排序数组
    @param l:左边界
    @param r:右边界
    @return j: 新的基准值的位置
    """
    #构造一个随机下标
    index = random.randint(l,r)
    #交换一下随机下标和最左侧的值,这样可以不动后面的逻辑
    arr[l],arr[index] = arr[index],arr[l]
    #把待排序数组的第一个值作为基准值
    v = arr[l]
    j = l
    for i in range(l+1,r):
    #如果右边的值比v小,就把它换到左边来
    if arr[i] < v:
    arr[j+1],arr[i] = arr[i],arr[j+1]
    j += 1
    #所有交换结束后,j位置左边的都比基准值小,j右边的都比基准值大,交换l和j
    arr[l],arr[j] = arr[j],arr[l]
    #返回新的基准值的位置
    return j

打印出来的结果是[1, 3, 2, 4, 6, 5, 8, 7, 9, 0],有一点点不明白,是哪里的逻辑出了错误

写回答

1回答

liuyubobobo

2018-08-22

测试用例只有十个数字。我怀疑这个错误用更小的数据集也能复现,比如5个数字。用更小的数据集复现这个错误,然后自己跟进去调试试试看?debug可是很重要的能力哦。要耐心:)


课程已经有同学完全使用Python语言实现了课程代码。如果需要可以参考。传送门:https://github.com/ShiveryMoon/Imooc-Algorithm-PythonEdition


加油!:)

0
2
liuyubobobo
回复
不务正业的码农
大赞!继续加油!:)
2018-08-22
共2条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程