c++实现对结构体的快速排序

C++知识点总结(16):结构体排序 第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的志愿者人数。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。 阅读详情

浅谈sort排序

在写这篇文章之前我对于结构体排序都是用STL的std::sort()
现假现有

typedef struct STreeNode* pSTreeNode;
struct STreeNode
{
	int nodeid;
	int namevalue;
	vector<pSTreeNode> pChildList;
}; 

对于pChildList的排序,加上头文件#include <algorithm>就可以用
std::sort(pChildList.begin(), pChildList.end, cmp);其中cmp是自己定义的内部排序规则。可能很多人跟我一样这样使用,STL提供的sort算法类似快速排序,算法时间复杂度是n*log2(n)
但是在实际的项目中,有经验的人都知道不可以轻易地使用STL里面的算法,虽然方便,但是在头文件里面你引进#include,对于项目编译来说是加了一层压力,特别是大的项目,如果你不注意使用标准库,可能对于某个模块来说没有什么,但是你加一个,他加一个。。。对整个项目的编译无疑是沉重的打击,所以能自己实现的算法何不自己写接口

快速排序的介绍##

时间复杂度:

快速排序的平均时间复杂度是nlogn,最坏情况是N方(基本有序,后面我会给大家证明),平均时间复杂度的证明较为繁琐,数学公式啦,感兴趣的可以百度学习一下

核心思想:

随机找出一个数(通常就拿数组第一个数据就行),把它插入一个位置,使得它左边的数都比它小,它右边的数据都比它大,这样就将一个数组分成了两个子数组,然后再按照同样的方法把子数组再分成更小的子数组,直到不能分解为止。它也是分治思想的一个经典实验(归并排序也是) 。快速排序将数组排序的方式是当两个子数组都有序时整个数组也就自然有序了

举例说明

假设现在有 6 1 2 7 9 3 4 5 10 8 这十个数,我们对这个十个数进行从小到大排序

方法:

找一个基准数不要被这个名次吓到了,它就是一个可以用来参照的数,我们就用第一个数6作为参照吧,接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边。

友情提示。回忆一下冒泡排序,是如何通过“交换”,一步步让每个数归位的。此时可以通过“交换”的方法来达到目的。具体是如何一步步交换呢?怎样交换才既方便又节省时间呢?在纸上画画看。以前第一次学习冒泡排序算法的时(N方)候,觉得冒泡排序很浪费时间,每次都只能对相邻的两个数进行比较,这显然太不合理了。于是我就想能不能。。。,后来才知道原来这就是“快速排序”。

步骤

1>分别从 序列6 1 2 7 9 3 4 5 10 8的两端开始试探,假设left = 0, right = n-1 先从右往左找一个小于6的数,把这个数放到低位,再从左往右找一个大于6的数,然后把这个数放到刚刚那个小于6的数的位置。

我们来模拟一下 从右往左找一个小于6的数,8 不是, 10不是, 5哦对了,记住他的下标,然后把5放到最低位,从左往右找一个大于6的数1 不是, 2不是, 7哦对了,然后把7放到刚刚5的位置
序列变成了 5 1 2 7 9 3 4 5 10 8(想想为什么), 比如 3 2 1这个序列 3 跟 2换, 3再跟1换。1再跟2换 何不 3直接跟1换(以2为参照的话)?

2>沿着刚刚的思想会继续换,这样序列变成了 5 1 2 4 9 3 9 7 10 8(这里为什么总是有两个数是相同的呢,想想这样会不会有什么影响,其实没有,因为每一轮下去两个游走的下标会相遇,即两个相同的数字相临,那么前者会是分界线,也就是基准数的位置 即会变成 5 1 2 4 3 9 9 7 10 8 )

3>下一次从右到左发现了他的前面就是left,然后把基准数移到left位置,至此第一轮交换完毕

4>这样的话 整个序列变成了 三个序列 分别是 5 1 2 4 3 和 6 和 9 7 10 8

然后对5 1 2 4 3 和 9 7 10 8重复上诉1 > 2> 3> 4>步骤

最后会得到 1 2 3 4 5 6 7 8 9 10

细心的朋友可能会发现如果每次能把这个序列均分,n个数 最终分成N/2组,最后再对每组的两个数排序,这样是最优的情况10000个数 一次分成2个5000
1+2次分成 四个 2500,1+2+3次分成8个1250,,那么最终需要1+…x 想想x是不是logn复杂度 就是 nlogn/2,,,
那么最糟糕的情况呢,基本有序的时候,10000个数分成9999 1 然后 9998 1 1以此类推,,然后每次移动都需要n-1次 这种情况是最糟糕的,所以快排是不稳定的排序算法。(每种排序算法都有缺点,局限性)

下面给出结构体的快速排序算法的代码实现,

假设有结构体

typedef struct STreeNode* pSTreeNode;
struct STreeNode
{
	int nodeid;
	int namevalue;
	vector<pSTreeNode> pChildList;
}; 

上诉实现

int 
CTree::Partition(vector<pSTreeNode>&nodeids, int left, int right)
{     
	pSTreeNode Righttmp = nodeids[left];//基准数
	while (left < right) {
		while(left < right && nodeids[right]->namevalue >= Righttmp->namevalue) {
			right--;
		}  
		nodeids[left] = nodeids[right];

		while(left < right && nodeids[left]->namevalue <= Righttmp->namevalue) {
			left++;
		}  
		nodeids[right] = nodeids[left];
	}
	nodeids[left] = Righttmp;
	return left;
}

void 
CTree::quickSort(vector<pSTreeNode>&nodeids, int left, int right)
{
	if (left < right)
	{
		int q = Partition(nodeids, left, right);
		quickSort(nodeids, left, q - 1);
		quickSort(nodeids, q + 1, right);
	}
}
C++ 结构体排序 - sort /版本1//void sort(开始位置,结束位置);//first:指向要排序范围的第⼀个元素的迭代器或者指针。//last:指向要排序范围的最后⼀个元素之后位置的迭代器或者指针。//版本2comp);//void sort(开始位置,结束位置,⾃定义排序函数);//first:指向要排序范围的第⼀个元素的迭代器或者指针。//last:指向要排序范围的最后⼀个元素之后位置的迭代器或者指针。//comp:是⼀个⽐较函数或者函数对象。 阅读详情

相关推荐

c++结构体排序方法总结

在写算法时,若要对自定义的结构体或类进行排序,常常以重载运算符的方式,加上标准模板库里的sort()函数进行排序。但是有时我们需要排序的对象是结构体的指针,这时就要使用其他方法。本文记录我的使用的两种算法模板,以供复习。 #include<iostream> #include<stdio.h> #include<string> #include<vecto...

BlackCarDriver的博客 4782

C++结构体如何排序

介绍了几种c++结构体排序的方法。

Ivoritow的博客 6086

掌握排序算法:快速排序与结构体的实践

本文深入探讨了快速排序算法的实现原理,通过追踪实际案例,分析了其分区过程和递归特性。同时,介绍了结构体在C++中的定义、声明和使用,强调了其与面向对象编程概念的联系。通过解释结构体中的内存分配和对齐,文章旨在帮助读者深入理解这两种技术的内部机制。

weixin_31620365的博客 510

c++的sort排序(包括结构体)

sort排序 (一)、从小到大:sort() int arr[]={2,3,4,52,1} sort(arr,arr+5); 其中括号里面有两个部分,表示从第一个元素arr[0]到第五个元素arr[4]按从小到大的顺序排列 若写为: sort(arr+i,arr+j) 表示被排序的是arr[i]到arr[j-1],其他元素保持原位置 若 (二)、从大到小:** greater<数据类型>()** sort(arr,arr+5,greater<int>()); (三)、自定义一种

weixin_49865619的博客 1万+

std::map看来可以被淘汰了?可以用vector来替代,而且更好

vector的优势在于内存连续,可以先std::sort,然后std::lower_bound,或者std::binary_search。而std::map,insert的时候,需要new出内存。

tumu_C的博客 1019

ACPWorkbench_for_BP10

ADC支持9种采样率:8000Hz、11025Hz、12000Hz、16000Hz、22050Hz、24000Hz、32000Hz、44100Hz 以及 48000Hz。选择5种MCLK源时, 模块内部的MCLK源无效。I2S 采样率支持:8K,11.025K,12K,16K, 22.05K, 24K, 32K, 44.1K, 48K, 88.2K, 96K, 176.4K 和 192K。DAC采样率支持:8K,11.025K,12K,16K,22.05K, 24K, 32K, 44.1K和48K。

dddds222_的博客 4554

快速排序

#include&lt;iostream&gt; using namespace std; #define max 20 int i,j,k,low,high,p,pk; typedef struct { int key; int otherwise; } type; typedef struct { //定义结构体 type a[max]; int length; } sqlist...

给你更好的 148

SAP MRKO与MIRO的对比分析:为何寄售结算需要定制开发?

本文深入分析了SAP系统中MRKO与MIRO在寄售结算中的功能差异,揭示了标准MRKO在财务控制和业务流程上的局限性。通过定制开发实践,如BAdI增强和界面优化,企业可显著提升结算效率与准确性。文章还探讨了未来SAP S/4HANA在寄售结算中的智能化趋势,为相关企业提供技术参考。

weixin_29300241的博客 419

深入讲解:C/C++ qsort快速排序函数

文章包含qsort函数的头文件、定义、作用、使用方法、模拟实现,内容详细精要、重点明确突出、语言生动有趣,保障大家学习的爽感、快感。不说废话,现在发车。

gybhh的博客 1791

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

f作者: 寒小阳 &&龙心尘 时间:2015年10月。 出处: 声明:版权所有,转载请注明出处,谢谢。手把手机器学习之逻辑回归应用——Kaggle泰坦尼克之灾1.引言先说一句,年末双十一什么的一来,真是非(mang)常(cheng)欢(gou)乐(le)!然后push自己抽出时间来写这篇blog的原因也非常简单: 写完前两篇逻辑回归的介绍和各个角度理解之后,小伙伴们纷纷表示『好像很高级的样纸,

寒小阳 43万+

frp 内网渗透案例:端口转发 + 二级代理(深入理解 frp 在内网渗透中的技巧)

本文使用 vulnstack7 靶场作为测试环境,解释 frp 内网渗透特殊使用姿势,通过此案例来提高内网渗透能力。接下来的演示环境只做了以下修改。攻击者 vps 的 ip 修改为:192.168.72.162。DMZ 区域的 ubuntu 的 ip1 修改为:192.168.72.129。先引入问题,当我们控制了 DMZ 的 ubuntu 并且拿到第二层网络的 ubuntu 的 rce 后,会出现以下两个问题。如何搭建隧道让 ubuntu 反弹 shell 给攻击者 vps?

anddddoooo的博客 1765

c++结构体的一种简单实现

c++结构体的实现 近期本代码新手对算法产生了兴趣,在自学的过程中,发现了结构体实在是太好用了吧。于是想把结构体的使用方法记录在博客中,方便以后忘记的时候查询,以及可以为和我一样0基础的代码小白学习参考。 结构体的实现 由于我不太喜欢看繁杂冗长的定义,加上网络上关于结构体定义的帖子已经很多了。所以本博客就通过一道简单的算法题来讲解结构体的实现。 题目来源于洛谷P1104 生日 题目描述 cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序。但cjf君最近作业很多,没有时间,所以请你帮她排序。 .

那就这样吧 557

高并发网络爬虫实践(欧赔、亚盘、大小指数数据爬取)

本文通过对一个实战化的高并发网络爬虫脚本进行深度模块化剖析,展示了如何构建一个兼具性能、健壮性和易用性的数据采集工具。核心设计思想总结模块化与单一职责: 每个函数都专注于解决一个特定问题,无论是网络请求、数据解析还是文件操作。并发与效率: 通过ThreadPoolExecutor实现了高效的并发抓取,极大缩短了总耗时。健壮性与容错: 强大的重试机制、细致的异常处理和线程安全的文件写入,保证了程序在复杂网络环境下的稳定运行。断点续传: 精心设计了进度记录与恢复机制,使得大规模抓取任务变得轻松可控。

猫敷雪 480

结构体与快速排序 附例题

快速排序是通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序。分析:使用结构体,对生日进行快速排序,先比较年再比较月,最后比较日,如果都相同就比较编号。

weixin_65256888的博客 408

110、3A 端到端调试:从 ISP register dump 到主观画质的完整调试流程

文章摘要 本文分享了ISP 3A(AE/AWB/AF)端到端调试的实战经验,通过具体案例解析常见问题排查方法。从硬件链路确认、寄存器dump分析、算法闭环验证到主观画质调优,提出了一套系统化调试流程。重点包括:如何通过示波器和寄存器抓包定位时序问题,AWB调试中black level校正的关键作用,AF闭环控制中hall传感器反馈的重要性,以及算法与硬件联调的"三板斧"方法论。作者强调3A调试本质是系统工程,需结合物理层信号测量、数据通路验证和算法状态跟踪,避免陷入局部优化陷阱。

sundong_81的博客 57

OpenClaw零基础教程:30分钟搭建你的第一个AI自动化助手

别再看那些满是代码、专业术语的教程了,那些都是给程序员看的。这篇教程,我把所有步骤拆到了极致,你跟着点鼠标就行,点错了都没关系,大不了重装一遍,5分钟的事。

2601_94871597的博客 96

【上机笔试之四】快速排序(2)

这里介绍快速排序的应用,C++自带的快速排序函数,能够定义比较复杂的排序规则。每个结构体包含名字、年龄和分数。规则定义:将学生信息按成绩进行排序,成绩相同的则按照姓名的字母序进行排序。然后输出学生信息,按照如下格式:姓名、年龄、成绩。#include <iostream> #include <algorithm> #include <string.h> using namespace std; st

gent__chen的博客 482

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

c++结构体按元素排序

背景:创建结构体,有x,y,z三个元素,需要将结构体数组按元素z从小到大排 步骤: 1.创建结构体 struct stu{ int x; int y; int z; bool operator<(const stu &other)const{ return z < other.z; } } a[100]; 2.赋值 for(int i = 1; i <= n; i++){ cin >> a[i].x >> a[i].y >> a

xl_gjp_LOVER的博客 803

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++快速排序算法,用到了函数指针的代码

把写内容过程中经常用的内容记录起来,如下内容是关于C++快速排序算法,用到了函数指针的内容。 #include <iostream> #include <algorithm> #include <string> #include <cctype> struct example{ int id; std::string name; }...

bu40979的博客 202

PAT 1004 成绩排名 C++ 快速排序

PAT 1004 成绩排名 C++ 题目 读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行:正整数 n 第 2 行:第 1 个学生的姓名 学号 成绩 第 3 行:第 2 个学生的姓名 学号 成绩 … … … 第 n+1 行:第 n 个学生的姓名 学号 成绩 其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。 输

weixin_44888134的博客 661

C语言与C++ 快速排序 调用库函数的不同写法

通常我们会调用 库函数 #include 直接可以通过一步操作进行快速排序(时间复杂度为。

Zhang_Qin123的博客 260

快速排序之总结

最近突然之间发现快排的其他写法,从左向右的遍历和非递归方法,特添补如下: http://www.cnblogs.com/TenosDoIt/p/3665038.html 参考博客:https://www.cnblogs.com/sjy123/p/3287817.html 参考博客:https://blog.youkuaiyun.com/superlc320/article/details/1862489...

now 775

C++中结构体的各成员是一个整体

【算法代码】 #include <bits/stdc++.h> using namespace std; const int maxn=105; int n; struct node { int v,id; } p[maxn]; bool cmp(node x,node y) { if(x.v!=y.v) return x.v<y.v; return x.id<y.id; } int main() { scanf("%d%d",&n); for(i

hnjzsyjyj的专栏 694
上一篇: 字典树的运用,实现字符串的精确匹配与模糊匹配
下一篇: 深度优先搜索(DFS)
breakpoints_
博客等级 码龄9年 52粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breakpoints_

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值