sort函数详解(STL)

一直用着sort函数,感觉很强很好用,从来没想过他具体原理与实现

简单写一写吧

关于qsort与sort函数的区别(个人感觉qsort百度百科写的挺好)

关于qsort函数:
头文件:stdlib.h
用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
简单来说参数啥意思啊
1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
举例:
对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
qsort(a,1000,sizeof(int),cmp);

简单举例几个cmp的写法
1,对int类型数组排序
int num[100];

int cmp ( const void *a , const void *b )
    {
        return *(int *)a - *(int *)b;
     }
qsort(num,100,sizeof(num[0]),cmp);



可见:参数是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值。升序排列。
    因为是按照acs码的值进行的,所以在前面的字符的值一定小于后面的字符。
    那么,对于a b,如果a的值>b的值,就说明在字母表中a在b的后面,返回值为1表示ture,执行交换。

2.对字符串进行排序:
  char word[100];
   int cmp( const void *a , const void *b )
   {
        return *(char *)a - *(int *)b;
    }
    qsort(word,100,sizeof(word[0]),cmp);


3、对double类型数组排序(特别要注意)
 double in[100];
    int cmp( const void *a , const void *b )
    {
        return *(double *)a > *(double *)b ? 1 : -1;
       // 返回值的问题,显然cmp返回的是一个整型,所以避免double返回小数而被丢失。
     }
     qsort(in,100,sizeof(in[0]),cmp);

4:对结构体进行排序
struct Node
{
double data;
int other;
}s[100];
int Comp(constvoid*p1,constvoid*p2)
{
return(*(Node*)p2).data>(*(Node*)p1).data?1:-1;
}
qsort(s,100,sizeof(s[0]),Comp);



     对于sort函数,是qsort函数的升级版,功能强大更省事
sort 使用时得注明:using namespace std;   或直接打 std::sort()  还得加上  #include <algorithm>
 

例:
#include<iostream>
#include<algorithm>
using namespace std;
 
int main(){
      int a[20];
      for(int i=0;i<20;++i)
           cin>>a[i];
 
sort(a,a+20);          //范围,很明显这里是a+20 注意,这是必要的,如果是a+19
for(i=0;i<20;i++)        //最后一个值a[19]就不会参与排序。
           cout<<a[i]<<endl;
      return 0;
}


sort函数默认升序排列,也可以加自己定义的函数
举例1:
int cmp(int a,int b)  
{  
  return a>b;  
}  
//降序函数
注意与qsort函数的区别,不能写成return a-b;(因为会返回0,-1, 1)三个参数

若对数组从0到len-1的数组进行sort函数排序
sort(a,a+len,cmp);

举例略(字符串与double类型同理)

       对于结构体的排序:
struct node
{
	int x,y;
}a[100];

int cmp(node a,node b)
{
	return a.x<b.y;
}

sort(a,a+len,cmp);



部分内容转自:
http://blog.csdn.net/yzl_rex/article/details/7874513
http://blog.csdn.net/whegqing/article/details/42455705

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值