源自:http://blog.csdn.net/v_JULY_v/article/details/6452100
主要解决的是一维数组中,寻找给定区间第k小(大)的数。
思路:
1.通常会将给定的区间的树排序,然后遍历找出目标数。
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int data;
bool operator < (const node &p) const
{
return data < p.data;
}
};
node p[100001];
int main()
{
int n=7;
int i,a,b,c;//c:flag;
for(i=1;i<=n;i++)
{
scanf("%d",&p[i].data);
}
scanf("%d%d%d", &a, &b, &c); //b,a为原数组的下标索引
sort(p+a, p+b+1); //直接对给定区间进行排序,|b-a+1|*log(b-a+1)
printf("The number is %d/n", p[a-1+c].data);
return 0;
}
这种方法只能使用一次,难以实现多次查找,因为排序已经将原先的数组位置打乱。
2.伴随数组
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int num,data;
bool operator < (const node &p) const
{
return data < p.data;
}
};
node p[100001];
int main()
{
int n=7;
int i,a,b,c;//c:flag;
for(i=1;i<=n;i++)
{
scanf("%d",&p[i].data);
p[i].num = i;
}
sort(p+1,p+1+n); //调用库函数sort完成排序,复杂度n*logn
scanf("%d %d %d",&a,&b,&c);
for(i=1;i<=n;i++) //扫描一遍,复杂度n
{
if(p[i].num>=a && p[i].num<=b)
c--;
if(c == 0)
break;
}
printf("%d\n",p[i].data);
return 0;
}
数组中的下标始终伴随着数,可以多次查找。
在给定区间内,通过k--,直到k==0即可找到目标数。