C++的快排与upper_bound()和lower_bound()

来源:互联网 发布:网络传销犯罪典型案例 编辑:程序博客网 时间:2024/06/06 01:55

函数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。(注意:此时数组下标越界!!)

返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置

iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值> key的第一个元素。

快排:::

重点

数组的元素可能是任何类型的,甚至可能是结构体或联合,所以必须告诉函数qsort如何确定两个数组元素哪一个“更小”。通过编写比较函数可以为qsort提供这些信息。当给定两个指向数组元素的指针p和q时,比较函数必须返回一个整数,如果*p小于*q,那么返回的数为负数;如果*p等于*q,那么返回0.如果*p大于*q,返回正数.按照这种结果返回,qsort对数组默认是升序排序.如果想降序,只需要将上述结果返回值*-1即可

#include <stdio.h>
#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;

0 0