关于随机化的快速排序的问题,我添加了随机化之后,排序就乱了,不知道可不可以请老师帮忙看一下
来源: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
加油!:)
022018-08-22
相似问题