排序小结

我学过冒泡排序,归并排序,快速排序等。

现在只能写的出来归并排序。


在做题的时候,自己写一个排序是很麻烦的事情。

因此我们可以使用 C 和 C++ 自带的函数。下面总结一下。


qsort()

这是C语言自带的排序函数。

头文件: stdlib.h

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

一个典型的qsort写法如下:

qsort(s, n, sizeof(s[0]), cmp);

第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式);

第二个参数是参与排序的元素个数;

扫描二维码关注公众号,回复: 1857608 查看本文章

第三个参数是单个元素的大小,推荐使用sizeof(s[0])这样的表达式;

第四个参数是比较函数。


我认为不太好理解的就是第四个参数:比较函数。

比较函数决定了排序结果是升序还是降序。

对于我来说,不需要研究的很细致。

事实证明,研究不细致,坑的是自己!

通过如下代码说明。(已修改)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void print(int a[])
{
	int i;
	for (i = 0; i <= 4; i++)
		printf("%d ", a[i]);
	printf("%d\n\n", a[5]);
}

int cmp1(const void *a, const void *b)
{
	return *(int*)a - *(int*)b;
}

int cmp2(const void *a, const void *b)
{
	return *(int*)b - *(int*)a;
}

int main()
{
	int _a[] = { 2,4,6,5,3,1 };
	int a[6];


	// a-b 升序
	memcpy(a, _a, sizeof(a));
	qsort(a, 6, sizeof(a[0]), cmp1);
	printf("return a-b\n");
	print(a);
	/* 1 2 3 4 5 6 */

	// b-a 降序
	memcpy(a, _a, sizeof(a));
	qsort(a, 6, sizeof(a[0]), cmp2);
	printf("return b-a\n");
	print(a);
	/* 6 5 4 3 2 1 */

	return 0;
}


可以看出。对qsort()函数来说:

返回a-b,是升序排序;

返回b-a,是降序排序。


注意:

返回正数就是说 cmp 传入参数第一个要放在第二个后面, 负数就是传入参数第一个要放第二个前面, 如果是 0, 那就无所谓谁前谁后。


很赞的参考链接:http://www.cnblogs.com/sjy123/p/3287817.html


sort()

这是C++ STL中的排序函数。

头文件: algorithm

函数声明如下:

template< class RandomIt >
void sort( RandomIt first, RandomIt last );
 
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );


和上面一样,我写一个小栗子查看一下升序和降序。

#include <stdio.h>
#include <algorithm>

using namespace std;

void print(int a[])
{
	int i;
	for (i = 0; i <= 4; i++)
		printf("%d ", a[i]);
	printf("%d\n\n", a[5]);
}

int cmp1(int a, int b)
{
	return a > b;
}

int cmp2(int a, int b)
{
	return a < b;
}

int main()
{
	int _a[] = { 2,4,6,5,3,1 };
	int a[6];

	// 默认
	memcpy(a, _a, sizeof(a));
	sort(a, a + 6);
	printf("默认\n");
	print(a);
	/* 1 2 3 4 5 6 */

	// return a>b
	memcpy(a, _a, sizeof(a));
	sort(a, a + 6, cmp1);
	printf("return a>b\n");
	print(a);
	/* 6 5 4 3 2 1 */

	// return a<b
	memcpy(a, _a, sizeof(a));
	sort(a, a + 6, cmp2);
	printf("return a<b\n");
	print(a);
	/* 1 2 3 4 5 6 */

	return 0;
}


参考链接: https://www.cnblogs.com/lrj124/p/7254043.html


可以看出。对sort()函数来说:

当返回a>b时,是降序排序;

当返回a<b时,是升序排序。

猜你喜欢

转载自blog.csdn.net/qq_32862515/article/details/80757020