IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> CC++ qsort函数和sort函数 -> 正文阅读

[数据结构与算法]CC++ qsort函数和sort函数

qsort() 函数和 sort() 函数实现排序功能,前者是 C 语言内容,后者是 C++ 内容,下面逐一讲解。

qsort()

先来看一个对数组 arr 排序的例子。qsort() 函数在 stdlib.h 库中,使用时要包含该库文件。

#include <stdio.h>
#include <stdlib.h>

int cmp1(int * a, int * b)
{
	return *a - *b;
}

int main()
{
	int arr[5] = {3, 1, 5, 2, 4};
	qsort(a, 5, sizeof(int), cmp1);
	
	int i;
	for (i = 0; i < 5; i++)
		printf("%i ", a[i]);
	return 0;
} 

qsort() 函数有 4 个参数。第 1 个参数表示要排序的数组地址,这里参数为 arr,表示对数组 arr 排序。第 2 个参数表示要排序的元素个数,数组里有 5 个元素,所以为 5。第 3 个参数表示每个元素的大小(单位字节),通过 sizeof() 运算符计算 int 类型的字节数。第 4 个参数表示比较函数,形参为指针类型,返回值小于 0,表示 a 要在 b 的左侧,也即从小到大排序;大于 0 则相反;等于 0 顺序不确定。

假设对结构体 arr_s 排序,优先按照结构体中第 1 个元素大小排序,当第 1 个元素大小相等时,按第 2 个元素大小排序。

struct node
{
	int v1;
	int v2;
};

int cmp2(struct node * s1, struct node * s2)
{
	if (s1->v1 != s2->v1)
		return s1->v1 - s2->v1;
	return s1->v2 - s2->v2;
}

int main()
{
	struct node arr_s[5] = { {2, 3}, {1, 2}, {2, 2}, {3, 2}, {1, 1} };
	qsort(arr_s, 5, sizeof(struct node), cmp2);
	for (i = 0; i < 5; i++)
		printf("(%i, %i) ", arr_s[i].v1, arr_s[i].v2);
	return 0;
} 

将结构体改为二维数组的写法。

int cmp3(int * a, int * b) 
{
	if (a[0] != b[0])
    	return a[0] - b[0];
    return a[1] - b[1];
}

int main()
{	
	int arr2[5][2] = { {2, 3}, {1, 2}, {2, 2}, {3, 2}, {1, 1} };
	qsort(arr2, 5, sizeof(arr2[0]), cmp3);
	for (i = 0; i < 5; i++)
		printf("(%i, %i) ", arr2[i][0], arr2[i][1]);
	printf("\n");
	return 0;
} 

注意第 3 个参数的变化,由于是以行为单位排序,那么元素的大小是一行的大小。

严格来说,qsort() 函数的形参应该是 const void *cmp1() 函数的写法应当如下,需要将形参进行强制转化。

int cmp4(const void * a, const void * b)
{
	int * p1 = (int *) a;
	int * p2 = (int *) b;
	return *p1 - *p2;
}

sort()

sort() 函数是 C++ 的内容,使用时需要包含 algorithm 库,并且要使用 std 命名空间。同样实现对一维数组排序。

int main()
{
	int arr[5] = {3, 1, 5, 2, 4};
	sort(arr, arr + 5);
	for (int i = 0; i < 5; i++)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}

sort() 函数只需要 2 个参数,第 1 个参数是数组首地址,第 2 个参数表示结束地址,默认情况下是升序排序。如果需要降序排序,则需要自行实现 cmp() 函数。

bool cmp1(int a, int b)
{
	return a > b;
}

int main()
{
	int arr[5] = {3, 1, 5, 2, 4};
	sort(arr, arr + 5, cmp1);
	for (int i = 0; i < 5; i++)
		cout << arr[i] << " ";
	cout << endl;
	return 0;
}

利用 sort() 函数实现对结构体排序,必须传入 cmp() 函数。

struct node
{
	int v1;
	int v2;
};

bool cmp2(struct node s1, struct node s2)
{
	if (s1.v1 != s2.v1)
		return s1.v1 < s2.v1;
	return s1.v2 < s2.v2;
}

int main()
{
	struct node arr_s[5] = { {2, 3}, {1, 2}, {2, 2}, {3, 2}, {1, 1} };
	sort(arr_s, arr_s + 5, cmp2);
	for (int i = 0; i < 5; i++)
		cout << "(" <<arr_s[i].v1 << ", " << arr_s[i].v2 << ") ";
	cout << endl;
	
	return 0;
}

sort() 函数无法直接对二维数组排序,可以构造一个指针数组,其中每个指针元素都指向一个一维数组,同样需要自行完成 cmp() 函数。

bool cmp3(int a[], int b[])
{
	if (a[0] != b[0])
		return a[0] < b[0];
	return a[1] < b[1];
}

int main()
{
	int * arr2[5];
	int arr20[2] = {2, 3};
	int arr21[2] = {1, 2};
	int arr22[2] = {2, 3};
	int arr23[2] = {3, 2};
	int arr24[2] = {1, 1};
	arr2[0] = arr20;
	arr2[1] = arr21;
	arr2[2] = arr22;
	arr2[3] = arr23;
	arr2[4] = arr24;
	
	sort(arr2, arr2 + 5, cmp3);
	for (int i = 0; i < 5; i++)
		cout << "(" <<arr2[i][0] << ", " << arr2[i][1] << ") ";
	cout << endl;
	
	return 0;
}

使用 C++ 中 vectorvector 更为简便。

bool cmp4(vector<int> a, vector<int> b)
{
	if (a[0] != b[0])
		return a[0] < b[0];
	return a[1] < b[1];
}

int main()
{
	vector<vector<int> > vec({ {2, 3}, {1, 2}, {2, 2}, {3, 2}, {1, 1} });
	sort(vec.begin(), vec.end(), cmp4);

	for(auto v : vec)
		cout << "(" <<v[0] << ", " << v[1] << ") ";
	cout << endl;
	
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 11:59:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:24:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码