2011-05-01 53 views
0

嘿大家我试图实现代码查找顺序统计,但我得到一个错误..in算法两个变量传递在随机函数有没有什么办法来传递两个变量,如果是的比如何? ?如果没有那还有什么可以替代它的......你的帮助将不胜感激订单统计implmentation

#include<iostream.h> 
#include<conio.h> 
#include<stdlib.h> 

int RandomizedSelect(int*,int,int,int); 
int RandomizedPartition(int*, int, int); 
int partion(int*,int,int); 
void main() 
{ 
    int n,x,i; 
    cout<<"Enter length of array"; 
    cin>>n; 
    int *a=new int[n]; 
    cout<<"Enter elements of array"; 
    for(i=0;i<n;i++) 
    { 
     cin>>a[i]; 
    } 
    cout<<"Enter element less than size of array"; 
    cin>>x; 
    int z=RandomizedSelect(a,0, n, x); 
    cout<<z; 
    getch(); 


} 

int RandomizedSelect(int A[],int p, int r,int i) 
{ 
    if (p == r) 
    { 
     return A[p]; 
    } 
    int q = RandomizedPartition(A, p, r); 
    int k = q - p + 1; 
    if (i == k) 
    { 
     return A[q]; 
    } 
    else if (i < k) 
    { 
     return RandomizedSelect(A, p, q-1, i) ; 
    } 
    else return RandomizedSelect(A, q+1, r, i - k); 
} 
int Partition(int A[],int p,int r) 
{ 
    int x=A[r],temp; 
    int i=p-1,j; 
    for(j=p;j<r-1;j++) 
    { 
     if(A[j]<=x) 
     { 
      i++; 
      temp=A[i]; 
      A[i]=A[j]; 
      A[j]=temp; 
     } 
    } 
    temp=A[i+1]; 
    A[i+1]=A[r]; 
    A[r]=temp; 
    return i+1; 

} 
int RandomizedPartition(int A[],int p,int r) 
{ 

int temp; 
int j = random(p,r); 
temp=A[r]; 
A[r]=A[j]; 
A[j]=temp; 
return Partition(A, p, r); 
} 
+0

这两个参数做什么? – 2011-05-01 08:15:52

+1

'conio.h','void main','getch','iostream.h' :) :)这些让我回到高中。 – cnicutar 2011-05-01 08:18:37

+0

这两个参数随机选择p和r之间的一个值。 – james 2011-05-01 08:30:28

回答

1

要选择P和R之间的随机值,你可以使用这个公式:

p + rand()%(r-p+1); 

rand()给你在[0, RAND_MAX]中的伪随机整数值。然后您将余数(%)转换为[0, r-p]中的值(只要r-p+1小于RAND_MAX)。将它添加到p,您会得到一个值[p, r]

2

上面的代码在某些情况下不起作用。这里是更正后的代码。下面的代码工作正常我已检查所有情况。

#include<iostream> 
#include<cstdlib> 
using namespace std; 

int RandomizedSelect(int*,int,int,int); 
int RandomizedPartition(int*, int, int); 
int partion(int*,int,int); 
int main() 
{ 
int n,x,i; 
cout<<"Enter length of array: "; 
cin>>n; 
int *a=new int[n]; 
cout<<"Enter elements of array: "; 
for(i=0;i<n;i++) 
{ 
    cin>>a[i]; 
} 
cout<<"Enter element less than size of array: "; 
cin>>x; 
int z=RandomizedSelect(a,0, n-1, x); 
cout<<z; 
} 

int RandomizedSelect(int A[],int p, int r,int i) 
{ 
if (p == r) 
{ 
    return A[p]; 
} 
int q = RandomizedPartition(A, p, r); 
int k = q - p + 1; 
if (i == k) 
{ 
    return A[q]; 
} 
else if (i < k) 
{ 
    return RandomizedSelect(A, p, q-1, i) ; 
} 
    else return RandomizedSelect(A, q+1, r, i - k); 
} 
int Partition(int A[],int p,int r) 
{ 
int x=A[r],temp; 
int i=p-1,j; 
for(j=p;j<r;j++) 
{ 
    if(A[j]<=x) 
    { 
     i++; 
     temp=A[i]; 
     A[i]=A[j]; 
     A[j]=temp; 
    } 
} 
temp=A[i+1]; 
A[i+1]=A[r]; 
A[r]=temp; 
return i+1; 

} 
int RandomizedPartition(int A[],int p,int r) 
{ 

int temp; 
int j = p + rand()%(r-p+1); 
temp=A[r]; 
A[r]=A[j]; 
A[j]=temp; 

return Partition(A, p, r); 
}