C ++中的QuickSelect实现没有额外的内存分配

时间:2013-03-09 19:36:14

标签: c++ search quickselect

如果你不介意,我会有一些功课帮助。基本上这个想法是对一组值进行快速选择,但是我们得到了一个模板,我似乎无法弄清楚如何让函数与所提供的一起工作。

问题是值不能正确排列,或者如果它们确实存在,它们将在每次输入相同值时改变。

以下是我正在使用的功能,我将在代码之后用/ ** /表示代码,而任何其他行都是为我提供的模板的一部分

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>

using namespace std;

int partition(int *A, int len, int pivot_index)
{
   int pivot_value = A[pivot_index]; /**/

   int left = 0; /**/
   int l = left; /**/
   int right = len - 1; /**/
   while(left < right)  /**/
   { /**/
      while(A[left] < pivot_value) /**/
      { /**/
         left++; /**/
      } /**/

      while(A[right] > pivot_value) /**/
      { /**/
         right--; /**/
      } /**/

      if(A[left] < pivot_value) /**/
      { /**/
         swap(A[left], A[right]); /**/
      } /**/
  } /**/

  return left; /**/
}


int select (int *A, int len, int rank)
{
      if (len==1) return A[0];
      int pivot_index = rand() % len;
      int pivot_rank = partition(A, len, pivot_index);  

      if (rank == pivot_rank) return A[rank];
      if (rank < pivot_rank) return select(A, pivot_rank, rank);
      return select(A, len - pivot_rank, rank - pivot_rank ); /**/
}

int main(void)
{
   int N, *A;

   ifstream fin("test.txt");
   fin >> N;
   A = new int[N];
   for (int i=0; i<N; i++) fin >> A[i];
   fin.close();

   int r;
   cout << "Enter rank (0.." << N-1 << ")\n";
   while (cin >> r) {
      if (r < 0 || r >= N)
        cout << "Invalid rank\n";
     else 
        cout << "The element of rank " << r << " is " << select(A,N,r) << "\n";
   }

  delete[] A;
}

我的&#34; test.txt&#34; file包含以下值:

10 -- this denotes the length of the array or how many values it will read in
7
14
12
2
25
18
15
13
100
63

对此的任何帮助将不胜感激..我的教授没有解释这将如何工作,我在网上找到的任何其他例子都没有回答我的问题。我花了很多时间摆弄不同的实现方式,此时我根本不知道。 感谢

编辑:改了所以现在可以直接实现和编译。我还使用

添加了库

1 个答案:

答案 0 :(得分:1)

您的代码存在许多问题。

while(A[left] < pivot_value) {  left++; }

这不会检查左边是否超出数组的末尾。

while(A[right] > pivot_value) { right--;} 

这不检查该权限是否在数组开始之前没有运行。

while(left < right) 

这是

时的无限循环
  1. 左&lt;右
  2. A [left]&gt; = pivot_value
  3. A [right]&lt; = pivot_value
  4. select(A, len - pivot_rank, rank - pivot_rank );

    这不是继续使用的正确分区。