您的位置:首页 > 其它

poj 2104_变种快排

2013-05-02 10:24 351 查看
题目:

   找一列数种的第kth个数。

思路:

  
这个题要求的效率要高一些。如果按照每次选一段数字出来,快排后找kth数,效率不够。但是记录计数连同序号一起记录的话,只只需要排序一次就够了。

 

代码:

#include <stdio.h>

#include <stdlib.h>

#define N 100001

typedef struct{

   int data;

   int index;

}ARRAY;

ARRAY array
;

int partition(int low, int high)

{

   ARRAY tmp = array[low];

   while(low <
high)

   {

     
while(low<high &&
array[high].data > tmp.data)

        
high --;

     
if(low < high)

        
array[low] = array[high];

     
while(low <  high
&& array[low].data <
tmp.data)

        
low ++;

     
if(low < high)

        
array[high] = array[low];

   }

   array[low] = tmp;

   return low;

}

void sort(int low, int high)

{

   int index;

   if(low <
high)

   {

     
index = partition(low, high);

     
sort(low, index-1);

     
sort(index+1, high);

   }

}

main()

{

   int i, j, x, y, k, t=0, num1,
num2;

   scanf("%d
%d",&num1, &num2);

  
for(i=1;i<=num1;i++)

   {

     
scanf("%d",&array[i].data);

     
array[i].index = i;

   }

  
sort(1,num1);//针对array排序   

  
for(i=1;i<=num2;i++)

   {

     
t = 0;

     
scanf("%d %d
%d",&x,&y,&k);

     
for(j=1;j<=num1;j++)

        
if((array[j].index<=y)&&(array[j].index
>=x))

        
{

           
t++;

           
if(t == k)

              
break;

        
}

     
printf("%d\n",array[j].data);

   }

  // system("pause");

   return 0;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: