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万+

告别Quartus II的漫长等待:用VSCode+iverilog+GTKWave搭建你的轻量级Verilog仿真环境(2024保姆级教程)

本文详细介绍了如何利用VSCode、iverilog和GTKWave构建高效的Verilog/SystemVerilog开发环境,替代传统的Quartus II和ModelSim工具。通过2024年最新的保姆级教程,帮助开发者实现秒级启动、低资源消耗的轻量级仿真环境,显著提升数字电路设计的开发效率和调试体验。

weixin_33690963的博客 561

lattice 黑盒子的生成和使用(Creating Your Own Black Box Modules)

很多客户,特别是外包项目,需要做黑盒子,防止他人看到源码,那么这就需要对相关的源码打包加封了。diamond help 说的也是模糊模糊的,这次给出实际验证过的流程。 1.先将要加封的模块间一个工程,建好工程,写好代码之后,模块名字叫做crosslink(这个使用黑盒子的时候要用),代码如下: module crosslink( output wire[3:0] led, input wire clk, input wire reset ); reg [29:0] cnt; reg [3:0] led1;

qq_39633876的博客 1481

快速排序

#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

TOPCon vs PERC:2024年光伏电站投资,哪种技术更划算?

本文深入分析了2024年光伏电站投资中TOPCon与PERC技术的财务表现。通过对比初始系统成本、全生命周期发电量及环境适应性,指出当前TOPCon组件与PERC价差已显著缩小,其更高的转换效率和更低的衰减率能有效降低度电成本并提升项目内部收益率,为投资者提供更具长期价值的方案。

p5l2m9n4o6q的博客 267

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

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

gybhh的博客 1791

基于Codex与Skills的学术研究自动化全流程实战指南

还在为海量文献下载、整理、阅读和综述写作而头疼吗?面对堆积如山的PDF,你是否感到无从下手?从选题、文献检索、到写作、绘图、润色,再到应对AI检测和审稿意见,学术研究的每一步都充满挑战。本文将为你带来一套堪称“王炸组合”的解决方案: Codex + Skills 。这不是简单的工具介绍,而是一套从零开始,覆盖学术研究全流程的保姆级实战教程。我们将手把手教你如何安装、配置,并利用强大的Skills(技能)自动化处理文献下载管理、高效撰写综述、生成专业图表、智能润色降重,直至应对审稿。无论你是科研新手还是希望提

weixin_29041195的博客 764

跨境电商ERP开发之Shopee开发者账号申请

引言:由于电子信息技术和经济全球化的进一步发展,电子商务在国际贸易中的影响力和关键作用日渐突显,已变成中国出口贸易的市场趋势。跨境电商未来的发展前景必定是有助于减少经济成本、推动全球贸易便利化,有助于提高国内群众福祉,有助于打造良好的营商环境,从而推动经济长期健康发展。 gitee仓库地址: https://gitee.com/naturalwish/SSERP/tree/master 以下授权教学同ShopeeOpen Platform - Developer Guide 申请流程 ..

naturalwish的专栏 3637

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

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

那就这样吧 557

【DDR3 控制器设计】(1)MIG IP 核的详解与配置

2:1 比例的用户接口数据总线宽度是 MIG 内存接口宽度的 4 倍,比如 MIG 中配置的数据位宽是 16 位,而 DDR 双边采样,所以用户接口是 MIG 内存接口的 4 倍即数据位宽为 64 位,同理可以得到如果设置为 4:1 则是 8 倍的数据位宽即数据位宽为 128 位。这里选择不使用OFF。以下为 MIG 和 DDR 之间的连接框图,可以看到框图的左边是用户接口,中间是 MIG 核,右边是需要控制的 DDR 接口,用户只需要去配置使用 MIG 核,就可以对 DDR 进行控制读写等操作。

记录学习历程 5359

结构体与快速排序 附例题

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

weixin_65256888的博客 408

【Flink】FlinkSQL如何触发执行计算

Table (通过 StatementSet.addInsert() 输出给某个 Sink)和 INSERT 语句 (通过调用 StatementSet.addInsertSql())会先被缓存到 StatementSet 中,StatementSet.execute() 方法被调用时,所有的 sink 会被优化成一张有向无环图。该方法是用来将一个表的内容插入到目标表中,一旦该方法被调用, TABLE API 程序立即被翻译。该方法是用来执行一个 SQL 语句,一旦该方法被调用, SQL 语句立即被翻译。

一杯咖啡半杯糖的博客 1007

华为OD技术面真题 - Python开发 - 1

汇总华为OD技术面八股Python八股,高频技术真题并提供详细解答。

qq_45776114的博客 1717

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

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

gent__chen的博客 482

STM32F407中文手册

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

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

bu40979的博客 202

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值