qsort和sort排序函数的使用详解

C:qsort()

一、头文件

#include <stdlib.h>

二、函数格式

函数原型为:

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
  1. 数组名
  2. 元素个数
  3. 数组元素所占的字节数(如可以用sizeof(int)来表示)
  4. 排序原则(必须是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换位。其他常见类型:

  1. 浮点数(考虑精度损失的写法)
int cmp(const void *a,const void *b) {
	return *(double*)a>*(double*)b?1:-1;
}
  1. 字符
int cmp(const void *a,const void *b) {
	return *(char*)a-*(char*)b;
}
  1. 结构体
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值