函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置
举例如下:
一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标
则
pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number数组的下标为0的位置。
pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number数组的下标为1的位置(即10所在的位置)。
pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。
所以,要记住:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!~
返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置
函数upper_bound()返回的在前闭后开区间查找的关键字的上界,如一个数组number序列1,2,5,7.upper_bound(2)后,返回的位置是2(下标)也就是5所在的位置,同样,如果插入元素大于数组中全部元素,返回的是last。(注意:此时数组下标越界!!)
返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置
快排:::
重点
#include <stdlib.h>
int compi(const void *a, const void *b)
{
const int *p = (int *)a;
const int *q = (int *)b;
return *p - *q;
}
int compd(const void *a, const void *b)
{
const int *p = (int *)a;
const int *q = (int *)b;
return (*p - *q) * (-1);
}
int main()
{
int a[1000];
int i, len, type;
while(scanf("%d %d", &len, &type) != EOF)
{
for(i = 0; i < len; i ++)
{
scanf("%d", &a[i]);
}
switch(type)
{
case 1 :
//递增排序
qsort(a, len, sizeof(a[0]), compi);
break;
case 2 :
//递减排序
qsort(a, len, sizeof(a[0]), compd);
break;
}
if(type == 1)
{
printf("递增排序结果:\n");
}else
{
printf("递减排序结果:\n");
}
for(i = 0; i < len; i ++)
{
printf("%d ", a[i]);
}
printf("\n");
}
return 0;
}