qsort函数的用法
来源:互联网 发布:海马模拟器for mac 编辑:程序博客网 时间:2024/06/08 06:18
qsort()是C中的排序函数,其头文件为:#include<stdlib.h>
qsort函数功能很强大,但如结构体一级排序、二级排序、字符串排序等使用起来较为复杂。
函数原型:
void __cdecl qsort (void *base,size_t num,size_t width,int (__cdecl *comp)(const void *,const void*))
输入参数:
Base:待排序的数组num:数组元素的个数(长度)
width:每一个元素所占存储空间的大小
comp:用于对数组元素进行比较的函数的指针(需自己定义,决定排列的顺序)
以下是其具体分类及用法(升序排列):
一、对一维数组排序:
(Element_type 是一位数组中存放的数据类型,可以是char,int,float,double,ect)
int comp(const void * a,const void * b)
{
return *((Element_type*)a)>*((Element_type*)b)?1:-1;
}
int main()
{
Element_type list[MAX];initial(list);//这是对数组list[max]初始化 ,具体需要自己写,直接赋值初始化或者利用memset函数
qsort(list, sizeof(list),sizeof(Element_type),comp);//调用函数qsort
return 0;
}二、对字符串排序:
int Comp(const void *a,const void *b)
{
return strcmp((char *)a,(char *)b);
}
int main(){
char a[MAX1][MAX2];
initial(a);
qsort(a,lenth,sizeof(a[0]),Comp); //lenth 为数组a的长度
}
三、按结构体中某个关键字排序(对结构体一级排序):
struct Node {
double data;int other;
}s[100];
int Comp(const void* a,const void* b)
{
struct node *c=(node *)a;
struct node *d=(node *)b;
return (((c->date)>(d->date))?1:-1);//这里注意不要将强制转换直接写入到return语句中
}
qsort(s,100,sizeof(s[0]),Comp);
四、按结构体中多个关键字排序(对结构体多级排序)[以二级为例]:
struct Node
{
int x; int y;}s[100];
//按照x从小到大排序,当x相等时按y从大到小排序(这是3跟4的区别)
int Comp(const void *a,const void *b)
{
struct Node *c=(Node *)a;
struct Node *d=(Node *)b;
if(c->x!=d->x)
return c->x-d->x;
else
return d->y - c->y;
}
五、对结构体中字符串进行排序:
struct Node {
int data;char str[100];
}s[100];
//按照结构体中字符串 str 的字典序排序
int Comp(const void *p1,const void *p2)
{
return strcmp((*(Node *)p1).str,(*(Node *)p2).str);
}
qsort(s,100,sizeof(s[0],Comp);
六、计算几何中求凸包的 comp
int cmp(const void *a,const void *B) // 重点 cmp 函数,把除了 1 点外的所有点,旋转
角度排序
{
struct point *c=(point *)a;
struct point *d=(point *)b;
if( calc(*c,*d,p[1]) < 0)
return 1;
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y))// 如果在一条直线上,则把远的放在前面
return 1;
else
return -1;
}
七、对字符串数组进行排序(char *s[]型)
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
s[i]=(char*)malloc(sizeof(char*));
scanf("%s",s[i]);
}
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i<n;i++) printf("%sn",s[i]);
return(0);
}
int cmp(const void *a,const void *b)
{
return (strcmp(*(char**)a,*(char**)b));
}
** 关于快排的一些小问题 **
1.快排是不稳定的,这个不稳定一个表现在其使用的时间是不确定的,最好情况(O(n))和最坏情况(O(n^2))差距太大,我们一般说的O(nlog(n))都是指的是其平均时间.另一个不稳定表现在如果相同的比较元素,可能顺序不一样,假设我们有这样一个序列,3,3,3,但是这三个3是有区别的,我们标记为3a,3b,3c,快排后的结果不一定就是3a,3b,3c这样的排列,所以在某些特定场合我们要用结构体来使其稳定。
元素相同解决办法:
3.快排的比较函数的两个参数必须都是const void *的,这个要特别注意,同时注意对两个指针a,b进行强制转换。
4.快排qsort的第三个参数,那个sizeof,推荐是使用sizeof(s[0])这样,特别是对结构体。
5.如果要对数组进行部分排序,比如对一个s[n]的数组排列其从s[i]开始的m个元素,只需要
在第一个和第二个参数上进行一些修改:qsort(&s[i],m,sizeof(s[i]),cmp);
手工实现QuickSort
#include <stdio.h> int a[100],n,temp; void QuickSort(int h,int t) { if(h>=t) return; int mid=(h+t)/2,i=h,j=t,x; x=a[mid]; while(1) { while(a[i]<x) i++; while(a[j]>x) j--; if(i>=j) break; temp=a[i]; a[i]=a[j]; a[j]=temp; } a[mid]=a[j]; a[j]=x; QuickSort(h,j-1); QuickSort(j+1,t); return; } int main() { int i; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); QuickSort(0,n-1); for(i=0;i<n;i++) printf("%d ",a[i]); return(0); }
作者:Walk the horizon
对int数组排序:
#include <stdio.h>#include <string.h>#include <stdlib.h>int s[10000], n, i;int cmp(const void *a, const void *b){ return (*(int *)a - *(int *)b);}int main(){ scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &s[i]); qsort(s, n, sizeof(s[0]), cmp); for(i = 0; i < n; i++) printf("%d ", s[i]); return 0;}对char数据排序:
#include <stdio.h>#include <string.h>#include <stdlib.h>char s[10000], i, n;int cmp(const void *a,const void *b){ return (*(char *)a - *(char *)b);}int main(){ scanf("%s", s); n = strlen(s); qsort(s, n, sizeof(s[0]), cmp); printf("%s", s); return(0);}
对结构体排序:
#include <stdio.h>#include <stdlib.h>struct node{ double date1; int no;} s[100];int i, n;int cmp(const void *a,const void *b){ struct node *aa = (struct node *)a; struct node *bb = (struct node *)b; return (((aa->date1) > (bb->date1)) ? 1 : -1);}int main(){ scanf("%d", &n); for(i = 0; i < n; i++) { s[i].no = i + 1; scanf("%lf", &s[i].date1); } qsort(s, n, sizeof(s[0]), cmp); for(i = 0; i < n; i++) printf("%d %lf\n", s[i].no, s[i].date1); return(0);}
对结构体排序,加入no来使其稳定(即data值相等的情况下按原来的顺序排)。
#include <stdio.h>#include <stdlib.h>struct node{ double date1; int no;} s[100];int i, n;int cmp(const void *a, const void *b){ struct node *aa = (struct node *)a; struct node *bb = (struct node *)b; if(aa->date1 != bb->date1) return(((aa->date1) > (bb->date1)) ? 1 : -1); else return((aa->no) - (bb->no));}int main(){ scanf("%d", &n); for(i = 0; i < n; i++) { s[i].no = i + 1; scanf("%lf", &s[i].date1); } qsort(s, n, sizeof(s[0]), cmp); for(i = 0; i < n; i++) printf("%d %lf\n", s[i].no, s[i].date1); return 0;}
对字符串数组:
#include <stdio.h>#include <string.h>#include <stdlib.h>char s[100][100];int i, n;int cmp(const void *a, const void *b){ return (strcmp((char*)a, (char*)b));}int main(){ scanf("%d", &n); for(i = 0; i < n; i++) scanf("%s", s[i]); qsort(s, n, sizeof(s[0]), cmp); for(i = 0; i < n; i++) printf("%s\n", s[i]); return 0;}
对字符串数组排序(char *s[]型)。
#include <stdio.h>#include <string.h>#include <stdlib.h>char *s[100];int i, n;int cmp(const void *a, const void *b){ return (strcmp(*(char**)a, *(char**)b));}int main(){ scanf("%d", &n); for(i = 0; i < n; i++) { s[i] = (char*)malloc(sizeof(char*)); scanf("%s", s[i]); } qsort(s, n, sizeof(s[0]), cmp); for(i = 0; i < n; i++) printf("%s\n", s[i]); return 0;}
- qsort 函数的用法
- qsort函数的用法
- qsort函数的用法
- qsort函数的用法
- qsort函数的用法
- qsort函数的用法
- 详解qsort函数的用法
- 关于qsort函数的用法
- qsort函数的比较函数用法
- sort函数 以及 qsort函数的用法
- 函数qsort()和bsearch()的用法
- C++ 排序函数 sort(),qsort()的用法
- C语言qsort函数的用法
- C++ 排序函数 sort(),qsort()的用法
- c字符串的qsort函数用法
- C++ 排序函数 sort(),qsort()的用法
- sort函数和qsort的用法详解
- C++ 排序函数 sort(),qsort()的用法
- 增强现实(AR)+Unity 虚拟按键官方底层图片研究
- Web前端应该从哪些方面来优化网站
- RCNN学习笔记(1):Rich feature hierarchies for accurate object detection and semantic segmentation
- C#自定义控件之-自定义MessageBox
- java.lang.NoClassDefFoundError
- qsort函数的用法
- JAVA AIO 服务器与客户端实现示例
- MSVOD笔记
- 将两个Excel表中的数据合并
- 变量作用域
- Unicode字符列表
- Paint和Color类
- [kuangbin带你飞]专题十二 基础DP1 J HDU 1160
- Android平板开发之固件烧写