`
duoerbasilu
  • 浏览: 1486443 次
文章分类
社区版块
存档分类
最新评论

qsort()如此强大

 
阅读更多

这是一个排序的函数,包含在头文件#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;
}





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics