C:qsort()
一、头文件
#include <stdlib.h>
二、函数格式
函数原型为:
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
- 数组名
- 元素个数
- 数组元素所占的字节数(如可以用sizeof(int)来表示)
- 排序原则(必须是int类型函数)
int cmp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
qsort(num,n,sizeof(int),cmp);
三、关于排序原则
作为排序原则的cmp函数的参数需要以const void *a,const void *b的形式来定义,在return中进行强制类型转换为对应类型。如上例子的写法表示以递增顺序,若想以递减只需将a和b换位。其他常见类型:
- 浮点数(考虑精度损失的写法)
int cmp(const void *a,const void *b) {
return *(double*)a>*(double*)b?1:-1;
}
- 字符
int cmp(const void *a,const void *b) {
return *(char*)a-*(char*)b;
}
- 结构体
struct node{
int i;
double j;
char k;
};
int cmp(const void *a,const void *b) {
return (*(node*)a).i-(*(node*)b).i;
}
C++:sort()
一、头文件
#include <algorithm>
二、函数原理
- sort()函数可以对给定区间所有元素进行排序。
- 时间复杂度为n*log2(n)。sort()采用了一种称为“Introsort(内省排序)”的混合排序方法。Introsort结合了三种不同的排序算法:快速排序(Quicksort)、堆排序(Heapsort)和插入排序(Insertion Sort)。这三种算法在不同情况下表现更好,因此Introsort试图根据输入数据的性质来选择最合适的算法。Introsort的基本思想是使用快速排序,但在递归深度达到一定阈值时,切换到堆排序,以避免快速排序在最坏情况下的性能问题。此外,如果待排序的元素数量较小,Introsort可能会切换到插入排序,因为对于小规模数据,插入排序通常更有效。
三、函数使用
- 它有三个参数sort(begin, end, cmp),其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数缺省默认从小到大进行排序。
- 如果我们想从大到小排序可以将cmp参数写为
greater<int>()
,需要头文件#include <functional>
; - 与qsort()不同,sort()的cmp函数的类型是bool,cmp函数的形参列表也不同,不需要使用const void * 类型。
四、用例
- 例1:vector从小到大排序
#include <algorithm> // 包含头文件以使用 sort 函数
#include <vector> // 如果你使用 vector 作为容器的话
int main() {
// 创建一个包含一些元素的容器,比如 vector
std::vector<int> myVector = {5, 2, 8, 1, 3};
// 使用 sort 函数对容器中的元素进行排序
std::sort(myVector.begin(), myVector.end());
// 现在 myVector 中的元素已经按升序排列
// 可以遍历容器并输出排序后的元素
for (int num : myVector) {
std::cout << num << " ";
}
return 0;
}
- 例2:vector从大到小排序
#include <algorithm>
#include <vector>
#include <functional> // 包含头文件以使用 std::greater
int main() {
std::vector<int> myVector = {5, 2, 8, 1, 3};
// 使用 std::greater 对容器中的元素进行降序排序
std::sort(myVector.begin(), myVector.end(), std::greater<int>());
// 输出排序后的元素
for (int num : myVector) {
std::cout << num << " ";
}
return 0;
}
- 例3:vector使用比较函数
#include <iostream>
#include <vector>
#include <algorithm>
// 比较函数,用于按照元素的绝对值进行排序
bool compareAbsolute(int a, int b) {
return std::abs(a) < std::abs(b);
}
int main() {
std::vector<int> myVector = {5, -2, 8, -1, 3};
// 使用 compareAbsolute 函数对容器中的元素进行排序
std::sort(myVector.begin(), myVector.end(), compareAbsolute);
// 输出排序后的元素
for (int num : myVector) {
std::cout << num << " ";
}
return 0;
}
- 例4:排序部分序列,注意截取的末尾要比待排上界多1
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> myVector = {5, -2, 8, -1, 3};
// 仅对容器中索引为 1 到 4 的元素进行排序
std::sort(myVector.begin() + 1, myVector.begin() + 5);
// 输出排序后的元素
for (int num : myVector) {
std::cout << num << " ";
}
return 0;
}