一直用着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 指向函数的指针,用于确定排序的顺序
举例:
对于sort函数,是qsort函数的升级版,功能强大更省事
对于结构体的排序:
对一个长为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 使用时得注明: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