C++ qsort 排序函数

是C中的函数,需要添加:

#include <cstdio>

用法:qsort(起始地址,数组长度,元素大小,比较函数)
在这里插入图片描述
例子:

#include <iostream>
#include <cstdio>
using namespace std;
//比较函数
int fcmp(const void* elem1, const void* elem2) {//void* 是万能指针
	const int* i1 = (const int*)elem1;
	const int* i2 = (const int*)elem2;
	if (*i1 < *i2)
		return -1;
	else if (*i1 == *i2)
		return 0;
	else if (*i1 > *i2)
		return 1;
}

int main() {
	int ia[10] = { 32,92,67,58,10,4,25,52,59,54 };
	for (int i = 0; i < 10; i++)
		cout << ia[i]<<",";
	cout << endl;
	qsort(ia, sizeof(ia) / sizeof(ia[0]), sizeof(ia[0]), fcmp);//qsort,类似于仿函数
	for (int i = 0; i < 10; i++)
		cout << ia[i] << ",";
}

在这里插入图片描述

### C++ 中 `qsort` 函数的自定义排序实现 在C++中,可以利用标准库中的 `qsort` 函数来对数组或其他数据结构进行排序。为了实现自定义排序逻辑,需要提供一个比较函数作为参数传递给 `qsort`。 #### 定义比较函数 对于结构体类型的数组,可以通过编写特定的比较函数来进行排序。下面是一个基于名称和ID字段对结构体数组进行排序的例子: ```cpp #include <iostream> #include <cstring> // For strcmp #include <cstdlib> // For qsort struct MyStruct { char name[50]; int id; }; // 比较两个MyStruct对象的名字 int compareByName(const void* a, const void* b) { return strcmp(static_cast<const MyStruct*>(a)->name, static_cast<const MyStruct*>(b)->name); } // 比较两个MyStruct对象的id int compareById(const void* a, const void* b) { return (static_cast<const MyStruct*>(a)->id - static_cast<const MyStruct*>(b)->id); } ``` 上述代码展示了两种不同的比较方式:一种是比较字符串形式的名字[^1];另一种则是整数形式的ID[^1]。 #### 使用 `qsort` 进行排序 一旦有了合适的比较函数,就可以调用 `qsort` 来执行实际的排序操作了: ```cpp void sortByProperty(MyStruct array[], size_t length, int (*compare)(const void*, const void*)) { qsort(array, length, sizeof(MyStruct), compare); } int main() { MyStruct users[] = {{"Alice", 2}, {"Bob", 3}, {"Charlie", 1}}; size_t numUsers = sizeof(users)/sizeof(users[0]); std::cout << "Before sorting by ID:\n"; for(auto& user : users){ std::cout << user.name << ", " << user.id << '\n'; } // 对users按照ID升序排列 sortByProperty(users, numUsers, compareById); std::cout << "\nAfter sorting by ID:\n"; for(auto& user : users){ std::cout << user.name << ", " << user.id << '\n'; } // 如果想要按名字排序,则只需更改第三个参数为compareByName即可 return 0; } ``` 这段程序先打印未排序前的数据列表,接着通过传入不同版本的比较器实现了两次排序——一次依据ID,另一次可以根据需求改为依据姓名。 需要注意的是,在现代C++编程实践中更推荐使用STL容器(如vector)以及算法库<algorithm>里的std::sort替代传统的C风格`qsort`接口,因为前者提供了更好的类型安全性和性能优化特性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值