|
很抱歉帖子发出去后代码的格式会比较混乱。
这个算法不是最优的,用树结构比较应该在时间复杂度上得到提高。
这是我好几年前写的一个题目,现在正在做毕业设计,刚刚整理一大堆的代码,算是高一段落,现在写代码的心情都没有了。
int CBalls::split(int start, int end)
{
int i = start,j = end;
int pivot = Balls[i];
int equals = 0;
while(i < j)
{
//从后端开始一直查找到比中枢值小的项
while(i<j && pivot <= Balls[j])
{
if(pivot == Balls[j--]) equals++;
}
//将小于中枢值的项提前
Balls[i] = Balls[j];
//从开始端向后查找比中枢值大的项
while(i<j && pivot > Balls[i])
i++;
//将开始端的比中枢值大或等的项后移
Balls[j] = Balls[i];
}
//中间项赋值
Balls[i] = pivot;
//检查中枢值是否为标准值
if(equals == numBalls - numBadBalls - 1)
{
bFind = true;
//记录下标准值所在的范围
startPos = i;
endPos = end;
}
//返回中枢值位置
return i;
}
void CBalls:: qsort(int low, int high)
{
if(low < high)
{
int pivoltLoc = split(low, high);
if(!bFind && pivoltLoc - low > numBalls - numBadBalls)
qsort(low, pivoltLoc - 1);
if(!bFind && high - pivoltLoc > numBalls - numBadBalls)
qsort(pivoltLoc + 1 ,high);
}
}
|