C++的std::sort

最近算法作业经常需要排序。偶是一个很懒的人,于是一直用C++的sort进行排序~~~不少同志对此心存疑虑,所以今天就写一写sort的用法。
声明:此用法是从某大牛的程序中看到的,其实偶只是拿来用,不知所以然,飘走~~~~~

MSDN中的定义:

template<class RanIt>
    void sort(RanIt first, RanIt last); //--> 1)
template<class RanIt, class Pred>
    void sort(RanIt first, RanIt last, Pred pr); //--> 2)


头文件:
#include <algorithm>
using namespace std;

1.默认的sort函数是按升序排。对应于1)
sort(a,a+n); //两个参数分别为待排序数组的首地址和尾地址
2.可以自己写一个cmp函数,按特定意图进行排序。对应于2)
例如:
int cmp( const int &a, const int &b ){
if( a > b )
return 1;
else
return 0;
}
sort(a,a+n,cmp);
是对数组a降序排序
又如:
int cmp( const POINT &a, const POINT &b ){
if( a.x < b.x )
return 1;
else
if( a.x == b.x ){
if( a.y < b.y )
return 1;
else
return 0;
}
else
return 0;
}
sort(a,a+n,cmp);
是先按x升序排序,若x值相等则按y升序排



与此类似的还有C中的qsort,以下同附上qsort的使用方法:

#include <stdlib.h>

格式 qsort(array_name,data_number,sizeof(data_type),compare_function_name) (void*)bsearch (pointer_to_key_word,array_name,find_number,

sizeof(data_type),compare_function_name)

e.g.

int Cmp(const void*a,const void *b)

{

int*pa=(int*)a,*pb=(int*)b;

if(*pa>*pb) return 1;

else if (*pa==*pb) return 0;

else return -1;

}

qsort(data,N,sizeof(int),Cmp); // 对int型数组进行快速排序(非降序排列)

p=(int*)bsearch(&a,data,n,sizeof(int),Cmp);

以上。希望对各位有所帮助。
PS:FJNU OJ上是禁止使用qsort滴~~~~

+++++++++++++++++++++++

1.

《Effective STL》里这些话可能对你也有用处:
item 31
  
  “我们总结一下你的排序选择:
   ● 如果你需要在vector、string、deque或数组上进行完全排序,你可以使用sort或stable_sort。
   ● 如果你有一个vector、string、deque或数组,你只需要排序前n个元素,应该用partial_sort。
   ● 如果你有一个vector、string、deque或数组,你需要鉴别出第n个元素或你需要鉴别出最前的n个元素,而不用知道它们的顺序,nth_element是你应该注意和调用的。
   ● 如果你需要把标准序列容器的元素或数组分隔为满足和不满足某个标准,你大概就要找partition或stable_partition。
   ● 如果你的数据是在list中,你可以直接使用partition和stable_partition,你可以使用list的sort来代替sort和stable_sort。如果你需要partial_sort或nth_element提供的效果,你就必须间接完成这个任务,但正如我在上面勾画的,会有很多选择。

  
  另外,你可以通过把数据放在标准关联容器中的方法以保持在任何时候东西都有序。你也可能会考虑标准非STL容器priority_queue,它也可以总是保持它的元素有序。”

++++++++++++++++++++++++++

2.

sort()和qsort()

有区别的,应该是sort函数的效率更高吧。
qsort(数组名,数组长度,数组中每个元素大小,compare);     compare函数的写法决定了排序是升序还是降序。需要#include<stdlib.h>
例如:
int compare(const void*a,const void*b){return *(*int)a-*(int*)b;}  
示例:qsort(a,10,sizeof(int),compare)    //假设已定义了整型数组a[10]
升序排序的写法,如果是:return *(*int)b-*(int*)a   就是降序,不论是什么类型的数组,该函数的形式都是这样的
sort(数组名,数组末地址,compare)    //若不写compare则默认升序排列,需要#include<algorithm>
例如:
sort(a,a+10);        //将数组a以升序排序,假设先前定义了a[10]并输入了数据 
其实升序还是降序没有多大关系,无所谓了,在输出语句做很小的改动就ok了!

 

c中的std::sort是一个标准库函数,用于对数组或容器中的元素进行排序。它可以按照默认的小于运算符(operator<)进行排序,也可以使用自定义的比较函数对象或lambda表达式进行排序。 以下是使用std::sort函数对数组进行升序排序的示例代码: #include <iostream> #include <algorithm> int main() { int arr[] = {5, 2, 8, 1, 9}; std::sort(arr, arr + 5); for (int i = 0; i < 5; i++) { std::cout << arr[i] << " "; } return 0; } 在这个示例中,std::sort函数接受两个迭代器参数,分别指向要排序的范围的起始和末尾。数组arr的起始地址由arr传递给std::sort函数,而arr + 5则是数组的末尾地址(这里假设数组的大小是5)。std::sort函数将数组中的元素按照升序进行排序,并输出结果。 std::sort函数的语法如下: template<class RandomIt, class Compare> void sort(RandomIt first, RandomIt last, Compare comp); 其中,RandomIt是一个迭代器类型,用于指向排序范围的起始和末尾。Compare是一个比较函数对象或lambda表达式,用于指定排序的顺序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [[C++]std::sort()函数使用总结](https://blog.csdn.net/weixin_30906185/article/details/98305002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【C++sort函数](https://blog.csdn.net/XiugongHao/article/details/130977213)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值