我学过冒泡排序,归并排序,快速排序等。
现在只能写的出来归并排序。
在做题的时候,自己写一个排序是很麻烦的事情。
因此我们可以使用 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]这样的表达式);
第二个参数是参与排序的元素个数;
第三个参数是单个元素的大小,推荐使用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时,是升序排序。