qsort快速排序
2015-11-12 13:08
274 查看
函数原型:void qsort (void *base ,size_t num,size_t width,int(_cdecl * compare)(const void*,const void *));
头文件:stdlib.h
参数:void *base:待排序数组首地址
size_t num:数组中待排序元素的数量
size_t width:各元素占用空间大小
int(_cdecl * compare)(const void*,const void *):指向函数的指针,用于确定排序顺序
对快速排序的应用,主要是比较函数的编写
一、对int型数组排序
(与int型排序类似)
(若x不同,则按照x排序;若x相同时,按照y排序)
(相当于二维字符数组)
头文件:stdlib.h
参数:void *base:待排序数组首地址
size_t num:数组中待排序元素的数量
size_t width:各元素占用空间大小
int(_cdecl * compare)(const void*,const void *):指向函数的指针,用于确定排序顺序
对快速排序的应用,主要是比较函数的编写
一、对int型数组排序
int cmp(const void *a,const void *b)//void类型的指针可以指向任意类型 { return *(int *)a-*(int *)b; //强制类型转换指针a与指针b,将a和b指向qsort函数中的第三个参数类型 }代码示例:
#include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int main() { int a[10]; for(int i=0;i<10;i++) scanf("%d",&a[i]); qsort(a,10,sizeof(a[0]),cmp); for(int i=0;i<10;i++) printf("%d ",a[i]); return 0; }二、对double型数组排序
(与int型排序类似)
int cmp(const void *a,const void *b) { return *(double *)a>*(double *)b?1:-1; }三、对char型数组的排序
int cmp(const void *a,const void *b) { return *(char*)a-*(char*)b; }代码示例:
#include<stdio.h>四、对结构体一级排序
#include<stdlib.h>
int cmp(const void *a,const void *b) { return *(char*)a-*(char*)b; }
int main()
{
char a[10];
for(int i=0;i<10;i++)
scanf("%c",&a[i]);
qsort(a,10,sizeof(a[0]),cmp);
for(int i=0;i<10;i++)
printf("%c ",a[i]);
return 0;
}
struct T{ int x; int y; }t[100]; int cmp(const void *a,const void *b) { return ((T *)a)->x-((T *)b)->x; }代码示例:
#include<stdio.h>五、对结构体二级排序
#include<stdlib.h>
struct T{ int x; int y; }t[100]; int cmp(const void *a,const void *b) { return ((T *)a)->x-((T *)b)->x; }
int main()
{
for(int i=0;i<10;i++)
scanf("%d",&t[i].x);
qsort(t,10,sizeof(t[0]),cmp);
for(int i=0;i<10;i++)
printf("%d ",t[i]);
return 0;
}
(若x不同,则按照x排序;若x相同时,按照y排序)
#include<stdio.h> #include<stdlib.h> struct T{ int x; int y; int z; }t[100]; int cmp(const void *a,const void *b) { if(((T *)a)->x!=((T *)b)->x) return ((T *)a)->x-((T *)b)->x; else return ((T *)a)->y-((T *)b)->y; } int main() { for(int i=0;i<10;i++) scanf("%d",&t[i].x); qsort(t,10,sizeof(t[0]),cmp); for(int i=0;i<10;i++) printf("%d ",t[i]); return 0; }六、对结构体中的字符串排序
(相当于二维字符数组)
struct T { char str[10]; }s[100]; int cmp(const void *a,const void *b) { return strcmp(((T *)a)->str,((T *)b)->str); }代码示例:
#include<stdio.h> #include<stdlib.h> #include<string.h> struct T { char str[10]; }s[100]; int cmp(const void *a,const void *b) { return strcmp(((T *)a)->str,((T *)b)->str); } int main() { for(int i=0;i<10;i++) scanf("%s",&s[i].str); qsort(s,10,sizeof(s[0]),cmp); for(int i=0;i<10;i++) printf("%s ",s[i].str); return 0; }七、对二维字符数组排序
char s[2001][1001]; int cmp(const void *a, const void *b){ return strcmp((char *)a,(char *)b); }代码示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> char s[2001][1001]; int cmp(const void *a, const void *b){ return strcmp((char *)a,(char *)b); } int main(){ int i,n; scanf("%d",&n); getchar();//避免换行符被字符串接收 for(i=0;i<n;i++) gets(s[i]); qsort(s,n,sizeof(s[0]),cmp); for(i=0;i<n;i++) puts(s[i]); return 0; }
相关文章推荐
- IOS开发之UIScrollViewDelegate详解
- [bug]The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
- MySQL5.6不能插入中文字符串,已解决
- [桌面版] 在 Mockplus 2.1 (预览版)中使用切换面板
- Android中百度导航引擎初始化失败问题
- div光标
- 给Source Insight做个外挂系列之六--“TabSiPlus”的其它问题
- [桌面版] 在 Mockplus 2.1 (预览版)中使用滚动区
- 给Source Insight做个外挂系列之五--Insight “TabSiPlus”
- 国内O365和国外O365的区别
- 通过继承ListActivity实现列表
- 给Source Insight做个外挂系列之四--分析“Source Insight”
- Android权限机制总结与常见权限不足问题分析
- [kuangbin带你飞]专题一 简单搜索 A - 棋盘问题 poj1321
- 可以滚动的View设置padding和scrollbar需要注意
- 可以滚动的View设置padding和scrollbar需要注意
- 给Source Insight做个外挂系列之三--构建外挂软件的定制代码框架
- Go2Shell默认打开ITerm2或x-term
- 兼容性问题解决方案
- Codeforces Round #330 (Div. 2) (595A,595B(容斥原理))