这是一个排序的函数,包含在头文件#include<stdlib.h>中。因为排序在我们的编程中经常使用到,然而除了研究排序算法的时候我们会自己实现排序算法。在我们平时编程,如果没有特别的要求,我们还是使用标准库中写好的函数,既是出于编码效率的问题,我们也是为了代码运行的效率。当然在特定的时候我们需要自己实现特定要求的排序代码,但是不要急,我们先见识见识标准库排序函数的强大,到后面我们会专门讨论和研究排序算法的。
首先我们一起认识一下这个函数吧,下面是qsort()的函数原型
void qsort(
void* base,
size_t num,
size_t width,
int (
__cdecl* compare
)(
const void* elem1,
const void* elem2
)
);
函数参数说明:
base
Start of target array.
num
Array size in elements.
width
Element size in bytes.
compare
Comparison function.
elem1
Pointer to the key for the search.
elem2
Pointer to the array element to be compared with the key.
没有返回值。(参考MSDN)
下面我们直接进入我们的议题吧,利用qsort()排序。
l情景1:对字符数组和整形数组排序或比较字符串
如输入,3 2 4 1 5排序后输出??
如输入,b d s f g排序后输出??
如输入,abc abd dfgk kjljl 排序后输出??
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
//比较两个字符的大小
int Comp_char(const void *a, const void *b)
{
return *((char *)a) - *((char *)b);
}
//比较两个整数的大小
int Comp_int(const void *a, const void *b)
{
return *((int *)b) - *((int *)b);
}
//比较两个字符串的大小
int Comp_str(const void *a, const void *b)
{
return strcmp((char *)a, (char *)b);
}
//这里只给字符排序作为例子,我们已经给出了数值比较函数和字符串比较函数
//只要其他排序应用只要相应改变qsort( )函数的参数即可。
int main()
{
char arr[20];
int i = 0,j = 0;
int m,n;
cin>>n;
while (i<n)
{
j = 0;
cin>>m;
//输入测试用例,存放在数组中
while(j<m)
{
cin>>arr[j];
++ j;
}
//利用qsort()给arr排序
qsort(arr, m, sizeof(char), Comp_char);
//输出排序后的结果
j = 0;
while (j<m)
{
cout<<arr[j]<<" ";
++ j;
}
cout<<endl;
++ i;
}
return 0;
}
->课后思考???
如果把Comp_char()改成下面这样子,输出又是什么?
int Comp_char(constvoid *a, const void *b)
{
return *((char*)b) - *((char *)a);
}
情景二,多关键字排序
题目内容:
我们C语言协会实验室有很多的六面体,且长x,宽y,高z已知,我们现在要按下面的规则将他们排序,两个六面体a和b。如果a的长x比b的长x大,那么a排在b的前面,如果a的x和b的x相同,那么在比较他们的宽y,谁大谁排在前面,如果他们的宽也相同,那么比较他们的高z。我们假设没有任何相同大小的六面体。现在我们希望你对实验室这么多的六面体排序
输入描述:
先输入n,表示测试数据的组数,在输入m,代表六面体的个数,随后的n行分别为每个六面体的长,宽,高。
输出描述:
输出六面体排序后的顺序
输入样例:
1
3
1 2 3
2 3 1
1 3 2
输出样例:
2 3 1
1 3 2
1 2 3
应对策略:
我们只需要改变我们的Comprion函数即可,将我们比较的规则在Comprion函数实现即可,和我们上面几乎没有什么区别
C语言版:
#include<iostream>
#include<cstdlib>
using namespace std;
//六面体节点
struct Node{
int x; //长
int y; //宽
int z; //高
};
int Comp_node(const void *a, const void *b)
{
struct Node *node_a = (struct Node *)a;
struct Node *node_b = (struct Node *)b;
if (node_a->x != node_b->x)
{
return (node_b->x - node_a->x);
}
if (node_a->y != node_b->y)
{
return (node_b->y - node_a->y);
}
return (node_b->z - node_a->z);
}
int main()
{
int m,n;
int i = 0,j = 0;
struct Node node_arr[20];
cin>>n;
while (i<n)
{
cin>>m;
//输入m个六面体的长宽高
j = 0; //记得重新赋值为零
while (j<m)
{
cin>>node_arr[j].x>>node_arr[j].y>>node_arr[j].z;
++ j;
}
qsort(node_arr, m, sizeof(struct Node), Comp_node);
//输出排好序的结果
j = 0; //记得重新赋值为零
while (j<m)
{
cout<<node_arr[j].x<<" "<<node_arr[j].y<<" "<<node_arr[j].z<<endl;
++ j;
}
cout<<endl;
++ i;
}
return 0;
}
分享到:
相关推荐
qsort的七种用法
函数名称: qsort <br>函数原型: void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *,const void *) <br>函数功能: 使用C.A.R.Hoare排序法对数组base进行排序 <br>函数返回: ...
详细解读qsort,,,,绝对有用
C++写的各种QSort,还有效率对比代码..
在c++中qsort()排序函数的使用qsort函数应用大全,在同样的元素和同样的比较条件下,sort()的执行速度都比qsort()要快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。
C快速排序qsort,对一个数据数组进行快速排序
qsort的详细用法,可以用于自学。容易入门,懂
微软qsort算法,用起来就是比crt快
C语言:巧用qsort,编程省时省力的技巧,难道还不心动吗?
qsort函数常见用法 适合ACM竞赛入门选手使用
qsort测试,源码,crt,std::sort
VC中的qsort源代码,值得学习!这是我从网上搜集来的
快速排序库函数qsort的调用细则,内容很详尽,适合新手阅读!
c语言中一种快速的排序方法qsort,qsort的排序方法的具体行事和各种形式的详细举例说明。可以省去很多不必要的比较和循环
七种qsort排序方法 讲解详细 还不错呢 下来看看学习一下吧
qsort测试,对一般人没用 qsort测试,对一般人没用
C函数qsort的简介和用法_新手入门.ppt
详细介绍qsort用法,并且有例子,可以直接使用
C库函数qsort的实现,对学习指针有极大的帮助。可以实现任意类型数据的排序。
C语言qsort快排函数的模版,帮助深入认识模版的快速高效的风格。