找第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));
}

 

 3。 第三种方法可以采用算法导论上的SELECT算法。

4。当然 还可以通过插入排序。或者堆都可以弄出来.. 

posted @ 2010-08-24 17:40  David Luo  阅读(345)  评论(0编辑  收藏  举报