基于this答案,我想使用自定义停止条件的快速排序,以便从Python中的未排序数组生成k排序数组。我认为是len(array) = m*k
所以会有m
个子数组(不一定排序),子数组i
的元素低于或等于子数组j
的元素i<j
。
def partition(array, left, right):
pivot = array[right]
i = left - 1
for j in range(left, right):
if array[j] <= pivot:
i += 1
temp = array[i]
array[i] = array[j]
array[j] = temp
temp = array[right]
array[right] = array[i + 1]
array[i + 1] = temp
return i + 1
def k_quicksort(array, left, right, k):
if right - left > k:
p = partition(array, left, right)
k_quicksort(array, p + 1, right, k)
k_quicksort(array, left, p - 1, k)
我在链接中引用的答案表明我应该更改停止条件并检查开始(left
)和结束(right
)索引是否大于k分开如果没有那么就不要再发了。我用
x = [scipy.random.randint(1,100) for i in range(16)]
k_quicksort(x,0,len(x)-1,4)
我得到了
x = [19, 13, 1, 28, 42, 49, 73, 59, 62, 56, 74, 89, 78, 90, 91, 98]
哪个是错误的。我不清楚习惯性停止条件还是其他一些错误的bug?任何帮助将不胜感激
答案 0 :(得分:0)
要限制为difftime
数组,您需要跳过数组末尾的递归:
k-sorted
您需要分区以确保您正在排序的内容是正确的值。但是你可以跳过def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i]
def partition(array, left, right):
pivot = array[right - 1]
i = left
for j in range(left, right - 1):
if array[j] <= pivot:
swap(array, i, j)
i += 1
swap(array, right - 1, i)
return i
def k_quicksort(array, left, right, k):
if left == right:
return
p = partition(array, left, right)
k_quicksort(array, left, p, k)
if k > p + 1:
k_quicksort(array, p + 1, right, k)
右边所有值的递归(以及排序)。
编辑:修复你的快速排序。