R中出现意外的快速排序行为

时间:2017-05-10 19:00:46

标签: r quicksort montecarlo

所以我在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中猜测我在全局修改矢量方面做错了什么,但我无法弄明白。我希望你有任何想法。

2 个答案:

答案 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

最后:请使用<-进行分配。避免只在顶层指定的=