所以我在R中制作了一个蒙特卡罗Quicksort算法,它使用 int input = 0;
int previous = 0;
while((input = getchar()) != EOF)
{
if (input != ' ')
{
if (previous == ' ')
{
putchar('\n');
}
putchar(input);
}
previous = input;
}
if (input == ' ')
{
putchar('\n');
}
函数来确定每次迭代时新枢轴的位置。
我的快速排序功能如下所示:
sample
出于测试目的,我在每次执行脚本时使用一些随机值初始化一个向量:quickSort=function(arr, left, right) {
i = left
j = right
pivot = arr[sample(left:right, size=1)]
while (i <= j) {
while (arr[i] < pivot)
i=i+1
while (arr[j] > pivot)
j=j-1
if (i <= j) {
tmp = arr[i]
arr[i] <<- arr[j]
arr[j] <<- tmp
i=i+1
j=j-1
}
}
if (left < j)
quickSort(arr, left, j)
if(i < right)
quickSort(arr, i, right)
}
这就是我的函数调用,以及向量的打印:
arr=sample(1:30, size=5)
我在Visual Studio中测试了算法(当然是用C ++编写的),每次都得到预期的结果。我在R中猜测我在全局修改矢量方面做错了什么,但我无法弄明白。我希望你有任何想法。
答案 0 :(得分:1)
我认为你的问题在于使用<<-
。首先,您在父环境中更新名为arr
的变量,即使arr不是您传递给quickSort 的变量的名称。但是,在中,函数arr仍然被具有相同名称的局部变量所遮蔽 - 所以例如你对quickSort的递归调用是按照原始顺序传递的向量,而不是传递给它的向量更新的订单。
试试这个。请注意,返回更新的向量,而不是尝试在父环境中更新它,但是如果要更新原始变量,当然可以像arr <- quickSort(arr, 1, 5)
一样调用它。< / p>
quickSort=function(arr, left, right) {
i = left
j = right
pivot = arr[sample(left:right, size=1)]
while (i <= j) {
while (arr[i] < pivot)
i=i+1
while (arr[j] > pivot)
j=j-1
if (i <= j) {
tmp = arr[i]
arr[i] <- arr[j]
arr[j] <- tmp
i=i+1
j=j-1
}
}
if (left < j)
arr <- quickSort(arr, left, j)
if(i < right)
arr <- quickSort(arr, i, right)
arr
}
答案 1 :(得分:1)
您正在全球修改arr
;你似乎认为因此修改了快速排序参数arr
。此外,您的quicksort
函数应返回arr
。并且quicksort
来电的结果应该分配给arr
。如果您不这样做,arr
将不会被修改。无需为<<-
使用全局作业arr
。
将quicksort
功能更改为:
quickSort=function(arr, left, right) {
i = left
j = right
pivot = arr[sample(left:right, size=1)]
while (i <= j) {
while (arr[i] < pivot)
i=i+1
while (arr[j] > pivot)
j=j-1
if (i <= j) {
tmp = arr[i]
arr[i] <- arr[j]
arr[j] <- tmp
i=i+1
j=j-1
}
}
if (left < j)
arr <- quickSort(arr, left, j)
if(i < right)
arr <- quickSort(arr, i, right)
arr
}
现在让我们再试一次
arr=sample(1:30, size=5)
arr
# [1] 27 28 8 15 18
quickSort(arr, 1, 5)
# [1] 8 15 18 27 28
最后:请使用<-
进行分配。避免只在顶层指定的=
。