首页 > 编程知识 正文

c语言sort函数用法,sort排序函数用法

时间:2023-05-06 15:01:51 阅读:114329 作者:1682

自己每天排序,制造泡沫,探索二分,结果STL上跟着排序函数sort,qsort,总算解放了自己~

于是我自己总结了一下。 首先查看sort函数,见下表:

函数名称功能说明对sort指定区间所有要素进行排序稳定stable_sort指定区间的所有要素进行排序部分地对partial_sort指定区间的所有要素进行排序复制指定区间进行排序nth_element 使用找到t的partition,满足某个条件的元素位于前面,stable_partition相对稳定,满足某个条件的元素位于前面

使用#include algorithm sort可以使用此函数。 语法如下:

sort(begin,end )表示范围。 示例:

int_tmain(intargc,_TCHAR* argv[] () ) ) ) ) ) ) ) ) )。

{

inta [ 20 ]={ 2,4,1,23,5,76,0,43,24,65 },I;

for(I=0; i20; I )

couta[i]endl;

sort(a,a 20 );

for(I=0; i20; I )

couta[i]endl;

返回0;

}

输出结果是按升序排列数组a,说到这里,可能会被问到如何按降序排列。 这就是下一次讨论的内容

一种方法是自己编写和实现比较函数,然后调用三个参数的sort:sort(begin,end,compare )。 在list容器的情况下,也可以应用该方法,将compare作为sort的参数即可。 即,sort (比较)。

1 )自己创建compare函数:

Ool比较(int b,int b ) )。

{

返回AB; //按升序排列,换成返回ab则按降序排列

}

int_tmain(intargc,_TCHAR* argv[] () ) ) ) ) ) ) ) ) )。

{

inta [ 20 ]={ 2,4,1,23,5,76,0,43,24,65 },I;

for(I=0; i20; I )

couta[i]endl;

sort(a,a 20,比较);

for(I=0; i20; I )

couta[i]endl;

返回0;

}

2 )进而,使该操作能够应对变化。 也就是说,可以为比较函数提供表示是升序还是降序的参数,现在轮到函数对象出场了。

为了便于说明,先定义表示升序和降序的枚举类型EnumComp。 很简单:

枚举枚举命令{ ASC,DESC};

然后,我们开始用类编写这个函数对象。 采用“”还是“”取决于其参数。

类比较

{

隐私:

Enumcomp comp;

公共:

比较(enumcompc ) :comp(c ) c ) };

bool operator () (int num1,int num2) )。

{

是交换机(comp )

{

case ASC:

返回编号1编号2;

case DESC:

返回编号1编号2;

}

}

(;

然后使用sort(begin,end,compare ) ASC (升序,sort ) begin,end,compare ) desc (降序)实现降序。

主函数如下:

int main () )

{

inta [ 20 ]={ 2,4,1,23,5,76,0,43,24,65 },I;

for(I=0; i20; I )

couta[i]endl;

sort(a,a 20,compare ) ) desc );

for(I=0; i20; I )

couta[I]

]<<endl;
     return 0;
}

3)其实对于这么简单的任务(类型支持“<”、“>”等比较运算符),完全没必要自己写一个类出来。标准库里已经有现成的了,就在functional里,include进来就行了。functional提供了一堆基于模板的比较函数对象。它们是(看名字就知道意思了):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。对于这个问题来说,greater和less就足够了,直接拿过来用:

升序:sort(begin,end,less<data-type>()); 降序:sort(begin,end,greater<data-type>()).

int _tmain(int argc, _TCHAR* argv[])
{
      int a[20]={2,4,1,23,5,76,0,43,24,65},i;
      for(i=0;i<20;i++)
          cout<<a[i]<<endl;
      sort(a,a+20,greater<int>());
      for(i=0;i<20;i++)
          cout<<a[i]<<endl;
      return 0;
}

4)既然有迭代器,如果是string 就可以使用反向迭代器来完成逆序排列,程序如下:

int main()
{
     string str("cvicses");
     string s(str.rbegin(),str.rend());
     cout << s <<endl;
     return 0;
}

 

 

qsort():

原型:
_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*));

解释:    qsort ( 数组名 ,元素个数,元素占用的空间(sizeof),比较函数) 
比较函数是一个自己写的函数  遵循 int com(const void *a,const void *b) 的格式。
当a b关系为 >  <  = 时,分别返回正值 负值 零 (或者相反)。
使用a b 时要强制转换类型,从void * 转换回应有的类型后,进行操作。 
数组下标从零开始,个数为N, 下标0-(n-1)。

实例:
int compare(const void *a,const void *b)
{
     return *(int*)b-*(int*)a;  
}

int main()
{
     int a[20]={2,4,1,23,5,76,0,43,24,65},i;
     for(i=0;i<20;i++)
        cout<<a[i]<<endl;
     qsort((void *)a,20,sizeof(int),compare);
     for(i=0;i<20;i++)
        cout<<a[i]<<endl;
     return 0;
}

相关:

1)why你必须给予元素个数?

因为阵列不知道它自己有多少个元素

2)why你必须给予大小?

因为 qsort 不知道它要排序的单位.

3)why你必须写那个丑陋的、用来比较俩数值的函式?

因为 qsort 需要一个指标指向某个函式,因为它不知道它所要排序的元素型别.

4)why qsort 所使用的比较函式接受的是 const void* 引数而不是 char* 引数?

因为 qsort 可以对非字串的数值排序.

 

当然对于排序函数还有其他的用法,今天就只说这些,我也正在学习中,上述只是发表了一点自己的拙见,最后声明上诉实例是基于VC++2008。


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。