運行時出現的錯誤如題
演算法是快速選擇,具體代碼如下:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int pivot(vector<int> a,int left,int right);
int QuickSelect( vector<int> &a,int left,int right,int k);
int main()
{
int N,k,buffer,ak;
ifstream infile("input2.txt");
infile>>N;
infile>>k; //從檔案讀取
vector<int> a;
for(int i=0; i<N; i++)
{
infile>>buffer;
a.push_back(buffer); //從檔案讀取陣列
}
ak = QuickSelect(a,0,a.size()-1,k);
cout<<ak<<endl;
}
int pivot(vector<int> a,int left,int right)
{
vector<int> b;
int k,j=0,pivot;
for(int i=left;i<right+1;i+=5) //分成五個一組,找每組的中位數
{
k = QuickSelect(a,i,i+4,3);
b.push_back(k);
j++;
}
pivot = QuickSelect(b,0,b.size()-1,(b.size()-1)/2); //找分組后找出的中位數的中位數
return pivot;
}
int QuickSelect( vector<int> &a,int left,int right,int k)
{
int v;
v = pivot(a,left,right);
int i = left,j = right,t;
while(i < j) //大的放后面,小的放前面
{
while(a[j] >= v && i < j)
j--;
while(a[i] <= v && i < j)
i++;
t = a[i];
a[i] = a[j];
a[j] = t;
}
if(k < i+1)
return QuickSelect(a,left,i-1,k); //如果比i小,就在前面找
else if(k > i+1) //如果比i大,就在后面找
return QuickSelect(a,i+1,right,k);
else
return a[i];
}
檔案內容:
10 3
1 3 11 4 5 8 6 9 7 10
uj5u.com熱心網友回復:
Stack overflow 堆疊益處QuickSelect()和pivot()這兩個函式有點邏輯問題,自己修改一下
uj5u.com熱心網友回復:
同意樓上QuickSelect()和pivot()相互呼叫,形成死回圈,造成函式堆疊溢位
單步跟蹤一下,找到邏輯不對的地方。
uj5u.com熱心網友回復:
我改了一下,用兩個vector來存比pivot大和小的數可是卻出現了error C2660: “QuickSelect”: 函式不接受 2 個引數
我寫的QuickSelect明明是兩個引數的啊..為什么會這樣?菜鳥求賜教...
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int pivot(vector<int> a,int left,int right);
int QuickSelect( vector<int> &a,int left,int right,int k);
int main()
{
int N,k,buffer,ak;
ifstream infile("input2.txt");
infile>>N;
infile>>k;
vector<int> a;
for(int i=0; i<N; i++)
{
infile>>buffer;
a.push_back(buffer);
}
ak = QuickSelect(a,0,a.size()-1,k);
cout<<ak<<endl;
}
int pivot(vector<int> a)
{
vector<int> b;
int k,j=0,pivot;
for(int i=0;i<a.size();i+=5)
{
vector<int> tmp;
tmp.push_back(a[i]);
tmp.push_back(a[i+1]);
tmp.push_back(a[i+2]);
tmp.push_back(a[i+3]);
tmp.push_back(a[i+4]);
k = QuickSelect( tmp, 3);
b.push_back(k);
j++;
}
pivot = QuickSelect(b,(b.size()+1)/2);
return pivot;
}
int QuickSelect( vector<int> a,int k)
{
int v;
vector<int> L,R;
if(a.size()>4)
v = pivot(a);
else
v = a[0];
for(int i=0; i<a.size();i++ )
{
if(a[i] <= v )
{
L.push_back(a[i]);
}
if(a[i] > v )
{
R.push_back(a[i]);
}
}
if(k < L.size())
return QuickSelect(L,k);
else if(k > L.size())
return QuickSelect(R,k-L.size());
else
return v;
}
uj5u.com熱心網友回復:
