找第K大或者小的数
这个题的解法:可以先通过排序得到第K个数即是第K大数。
第二种解法就是利用快速排序的partition,这是一种随机算法,最坏情况下是n平方的,但是 平均情况下是 线性的。
代码如下:
//此划分的原理为,默认将地位的数据保存,然后利用这个位置作为缓冲,
//不断赋值。其中start永远指向空位。最后将保存的数据放入空位即可
int partition(int s[],int start,int end)
{
cout<<start<<" "<<end<<endl;
int p = (start+end)/2 ;
int t = s[p];
s[p] = s[start];
s[start] = t;
int pivot = s[start];
while (start<end)
{
while (start<end && s[end]>=pivot)
end--;
s[start] = s[end];
while (start<end && s[start]<=pivot)
start++;
s[end] =s[start];
}
s[start] = t;
return start;
}
void printarray(int w[],int n)
{
for (int i = 0;i<n;i++)
{
cout<<w[i]<<" ";
}
cout<<endl;
}
int find_K(int s[],int n,int k)
{
int start = 0,end = n-1;
int K = partition(s,start,end);
printarray(s,15);
while ( (K+1) != k)
{
if((K+1) > k )
{
end = K-1;
K = partition(s,start,K-1);
printarray(s,15);
}
else
{
start = K+1;
K = partition(s,K+1,end);
printarray(s,15);
}
}
return s[K];
}
void main()
{
int w[] = {4,6,4,2,2,3,5,7,6,4,32,4,6,7,8};
cout<< find_K(w,sizeof(w)/sizeof(int),13) <<endl;
printarray(w,sizeof(w)/sizeof(int));
}
//不断赋值。其中start永远指向空位。最后将保存的数据放入空位即可
int partition(int s[],int start,int end)
{
cout<<start<<" "<<end<<endl;
int p = (start+end)/2 ;
int t = s[p];
s[p] = s[start];
s[start] = t;
int pivot = s[start];
while (start<end)
{
while (start<end && s[end]>=pivot)
end--;
s[start] = s[end];
while (start<end && s[start]<=pivot)
start++;
s[end] =s[start];
}
s[start] = t;
return start;
}
void printarray(int w[],int n)
{
for (int i = 0;i<n;i++)
{
cout<<w[i]<<" ";
}
cout<<endl;
}
int find_K(int s[],int n,int k)
{
int start = 0,end = n-1;
int K = partition(s,start,end);
printarray(s,15);
while ( (K+1) != k)
{
if((K+1) > k )
{
end = K-1;
K = partition(s,start,K-1);
printarray(s,15);
}
else
{
start = K+1;
K = partition(s,K+1,end);
printarray(s,15);
}
}
return s[K];
}
void main()
{
int w[] = {4,6,4,2,2,3,5,7,6,4,32,4,6,7,8};
cout<< find_K(w,sizeof(w)/sizeof(int),13) <<endl;
printarray(w,sizeof(w)/sizeof(int));
}
3。 第三种方法可以采用算法导论上的SELECT算法。
4。当然 还可以通过插入排序。或者堆都可以弄出来..