在应用中,如果我们不需要自己来编写排序函数的话,可以通过C/C++中已经实现的库函数来完成排序任务。
一、sort函数
sort函数在C++中<algorithm>中,若要使用,需要加上头文件#include <algorithm>,它有如下几种形式:
(1)默认情况按升序排列:
假设数组为a[n],下标从0开始,对整个数组按升序排列:
int a[110], n; //n表示元素个数 sort(a, a+n); //整个数组按升序排列
(2)若要将某个区间的元素排列,比如需要将第3到第9个元素升序排列:
sort(a+3, a+10); //3~9是7个数,注意后面那个数字为什么是10
(3)如果需要按照降序排列,那么需要写一个cmp比较函数(一般按照升序排列的话,会调用默认的cmp函数:
bool cmp(int a, int b) { return b < a; //判断a与b的大小,因为降序,要b-a }
再使用sort函数:
sort(a, a+n, cmp); //降序排列,0~n-1
(4) cmp功能是很强大的,你可以按照任意的方法,任意的组织自己的数组该如何排列:
下面给个例子:对学生的成绩按降序排列:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; struct student { char name[20]; //学生姓名 int grade; //学生分数 }ST[100]; bool cmp(student a, student b) //注意这里是bool { return a.grade > b.grade; //判断大小,降序 } int main() { int n, gd; char str[20]; scanf("%d", &n); //输入学生人数 for(int i = 0; i < n; i++) { scanf("%s%d", str, &gd); //输入学生姓名和成绩 strcpy(ST[i].name, str); //存入学生结构体 ST[i].grade = gd; } sort(ST, ST+n, cmp); for(int i = 0; i < n; i++) printf("第%d名:%s %d\n", i+1, ST[i].name, ST[i].grade); return 0; }
运行结果:
sort函数很强大,复杂度O(nlog n),有兴趣的读者还可以自行探讨更多。
二、qsort函数
qsort函数,也就是快速排序算法,在C的<stdlib>库中,需加入头文件#include <cstdlib> 或#include <stdlib.h>。
调用qsort函数需要写cmp比较函数。
给出按升序排列的例子:
int cmp(const void* a, const void* b) //注意这里是int { return (int*)a - (int*)b; }
调用:
qsort(a, n, sizeof(int), cmp); //a为数组,n为个数
如果需要按照自己的意愿排列,那么同样重写cmp比较函数,就可以完成,和sort函数类似。时间复杂度为O(n log n),但是某些情况要比sort函数好。
时间: 2024-12-28 21:08:43