c++(升序数组+降序数组)二分函数的使用

c++数组使用stl二分函数

升序二分用法

摘要:
如:a[n]={0,1,2,3,4,5};
1,
lower_bound(a,a+n,val)可以返回第一个大于等于val的指针,否者返回a+n的指针,--------否者返回a+n的指针
lower_bound(a,a+n,val)-a则等于第一个大于等于val的下标,--------否者返回n
2,
upper_bound(a,a+n,val)可以返回第一个大于val的指针,否者返回a+n的指针,--------否者返回a+n的指针
upper_bound(a,a+n,val)-a则等于第一个大于val的下标,--------否者返回n

降序二分用法

摘要:
如:a[n]={5,4,3,2,1,0};
1,
lower_bound(a,a+n,val,greater< int >())可以返回第一个小于等于val的指针,--------否者返回a+n的指针
lower_bound(a,a+n,val,greater< int >())-a则等于第一个小于等于val的下标,--------否者返回n
2,
upper_bound(a,a+n,val,greater< int >())可以返回第一个小于val的指针,--------否者返回a+n的指针
upper_bound(a,a+n,val,greater< int >())-a则等于第一个小于val的下标,--------否者返回n
切记 :
升序不能加greater< int >()
降序必须加greater< int >()
不然会出现非常奇怪的错误
具体错误原因可参考:错误原因

比较器二分用法

lower_bound(a,a+n,val,cmp)
不早了,老夫先睡了,,不想写了有时间再补充

升序二分用法代码

#include <iostream>
#include <algorithm>
using namespace std;

int a[10]={0,4,5,6,6,6,7,8,8,9};
int main(){
    int tem;
    tem=lower_bound(a,a+10,  9  )-a;
    cout<<tem<<endl;//  9
    tem=lower_bound(a,a+10,  8  )-a;
    cout<<tem<<endl;//  7
    tem=lower_bound(a,a+10,  7  )-a;
    cout<<tem<<endl;//  6
    tem=lower_bound(a,a+10,  6  )-a;
    cout<<tem<<endl;//  3
    tem=lower_bound(a,a+10,  5  )-a;
    cout<<tem<<endl;//  2
    tem=lower_bound(a,a+10,  4  )-a;
    cout<<tem<<endl;//  1
    tem=lower_bound(a,a+10,  0  )-a;
    cout<<tem<<endl;//  0
    //lower_bound(a,a+n,val)可以返回第一个大于等于val的指针
    //lower_bound(a,a+n,val)-a则等于第一个大于等于val的下标
    //**********************************************//
    cout<<endl;
    tem=upper_bound(a,a+10,  9  )-a;
    cout<<tem<<endl;//  10
    tem=upper_bound(a,a+10,  8  )-a;
    cout<<tem<<endl;//  9
    tem=upper_bound(a,a+10,  7  )-a;
    cout<<tem<<endl;//  7
    tem=upper_bound(a,a+10,  6  )-a;
    cout<<tem<<endl;//  6
    tem=upper_bound(a,a+10,  5  )-a;
    cout<<tem<<endl;//  3
    tem=upper_bound(a,a+10,  4  )-a;
    cout<<tem<<endl;//  2
    tem=upper_bound(a,a+10,  0  )-a;
    cout<<tem<<endl;//  1
    //upper_bound(a,a+n,val)可以返回第一个大于val的指针
    //upper_bound(a,a+n,val)-a则等于第一个大于val的下标
    return 0;
}

降序二分用法代码

#include <iostream>
#include <algorithm>
using namespace std;

int a[10]={9,8,8,7,6,6,6,5,4,0};
int main(){
    int tem;
    tem=lower_bound(a,a+10,  9  ,greater<int>())-a;
    cout<<tem<<endl;//  0
    tem=lower_bound(a,a+10,  8  ,greater<int>())-a;
    cout<<tem<<endl;//  1
    tem=lower_bound(a,a+10,  7  ,greater<int>())-a;
    cout<<tem<<endl;//  3
    tem=lower_bound(a,a+10,  6  ,greater<int>())-a;
    cout<<tem<<endl;//  4
    tem=lower_bound(a,a+10,  5  ,greater<int>())-a;
    cout<<tem<<endl;//  7
    tem=lower_bound(a,a+10,  4  ,greater<int>())-a;
    cout<<tem<<endl;//  8
    tem=lower_bound(a,a+10,  0  ,greater<int>())-a;
    cout<<tem<<endl;//  9
    //lower_bound(a,a+n,val,greater< int >())可以返回第一个小于等于val的指针
	//lower_bound(a,a+n,val,greater< int >())-a则等于第一个小于等于val的下标
    //**********************************************//
    cout<<endl;
    tem=upper_bound(a,a+10,  9  ,greater<int>())-a;
    cout<<tem<<endl;//  1
    tem=upper_bound(a,a+10,  8  ,greater<int>())-a;
    cout<<tem<<endl;//  3
    tem=upper_bound(a,a+10,  7  ,greater<int>())-a;
    cout<<tem<<endl;//  4
    tem=upper_bound(a,a+10,  6  ,greater<int>())-a;
    cout<<tem<<endl;//  7
    tem=upper_bound(a,a+10,  5  ,greater<int>())-a;
    cout<<tem<<endl;//  8
    tem=upper_bound(a,a+10,  4  ,greater<int>())-a;
    cout<<tem<<endl;//  9
    tem=upper_bound(a,a+10,  0  ,greater<int>())-a;
    cout<<tem<<endl;//  10
    //upper_bound(a,a+n,val,greater< int >())可以返回第一个小于val的指针
    //upper_bound(a,a+n,val,greater< int >())-a则等于第一个小于val的下标
    return 0;
}

蒟蒻见解,欢迎更改

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: C语言中的sort()函数可以通过调整比较函数的返回值来实现升序降序排序。比较函数是sort()函数的一个参数,它用来判断两个元素的大小关系。 在升序排序中,比较函数应返回一个负数、0或正数来表示第一个元素小于、等于或大于第二个元素。如果我们想要在相等的情况下降序排序,我们可以在比较函数中调换两个元素的位置。这样,在相等的情况下返回正数,就会使得相等的元素按降序排列。 下面是一个示例,对一个整型数组进行排序,按升序排序,并在相等的情况下按降序排序。 ```c #include <stdio.h> #include <stdlib.h> int cmp(const void* a, const void* b) { int num1 = *(const int*)a; int num2 = *(const int*)b; if (num1 < num2) return -1; else if (num1 > num2) return 1; else return num2 - num1; // 在相等的情况下返回正数,实现降序排序 } int main() { int nums[] = {5, 2, 8, 6, 1}; int size = sizeof(nums) / sizeof(nums[0]); qsort(nums, size, sizeof(nums[0]), cmp); for (int i = 0; i < size; i++) { printf("%d ", nums[i]); } return 0; } ``` 输出结果为:1 2 5 6 8,即按升序排序。 ### 回答2: 在C语言中,可以使用qsort()函数来实现升序排序和相等时降序排序的功能。 qsort()函数是C标准库中的一个快速排序函数,可以对任意类型的数组进行排序。它的原型定义如下: ```c void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); ``` 其中,参数解释如下: - base:指向要排序的数组的第一个元素的指针。 - nmemb:数组中的元素个数。 - size:每个元素的大小(以字节为单位)。 - compar:比较函数的指针,用于确定元素之间的顺序。 比较函数的原型定义如下: ```c int compar(const void *a, const void *b); ``` 在比较函数中,如果返回值小于0,则认为a<b;如果返回值大于0,则认为a>b;如果返回值等于0,则认为a=b。 要实现升序排序和相等时降序排序的功能,只需在比较函数中做一些特殊的判断即可。 下面是一个示例代码,展示如何使用qsort()函数实现这种排序功能: ```c #include <stdio.h> #include <stdlib.h> int compar(const void *a, const void *b) { int x = *(int *)a; int y = *(int *)b; if (x < y) { return -1; // 升序 } else if (x > y) { return 1; // 升序 } else { return y - x; // 相等时降序 } } int main() { int arr[] = {5, 2, 8, 2, 1}; qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), compar); for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); } return 0; } ``` 以上代码中,比较函数先判断两个元素的大小关系,如果不相等则按升序排序;如果相等,则按照降序排序。 运行结果如下: ``` 1 2 2 5 8 ``` 这样就实现了在C语言中使用qsort()函数进行升序排序,相等时降序排序的功能。 ### 回答3: c sort是C语言中提供的一个排序函数,用于对数组进行排序。默认情况下,c sort函数会按照升序的方式对数组元素进行排序。 但是如果数组中存在相等的元素,c sort函数的默认行为是保持它们的相对顺序。也就是说,相等的元素在排序后的数组中仍然会保持原来的相对位置。 如果需要在相等元素之间按照降序排序,可以通过自定义比较函数来实现。比较函数可以作为参数传递给c sort函数,用于确定元素之间的比较规则。 比较函数需要满足以下条件: 1. 如果a小于b,则返回负值; 2. 如果a等于b,则返回0; 3. 如果a大于b,则返回正值。 当c sort函数需要比较两个元素时,会调用比较函数来确定它们之间的大小关系。根据比较函数的返回值,c sort函数会按照不同的顺序将元素进行排序。 所以,如果想要使c sort函数在排序过程中,相等的元素按照降序排序,只需要编写一个合适的比较函数,并将其作为参数传递给c sort函数即可。比较函数可以根据需要对相等元素的顺序进行调整,以实现相等降序的排序效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值