快速排序法及其应用

vb应用--快速排序-法实现二维数组的指定列排序  演示部分在窗口加一个command按钮启动后把窗体最大化,方便观看.****************************************Private Sub Command1_Click()Sub Command1_Click()这里不妨用10000个元素,事实上在窗体打出的第一个数字时,排序就已经完成了!!.可以不用再考虑排序的效率了Dim myAy(100 阅读详情

冒泡法:

/*
//对数组排序
int len=100;
float* arry= new float[len]();
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
	arry[i]=rand();
}
Sort(arry,len,true);
delete[] arry;
*/
template<typename T>
void Sort(T* arry,int size,bool Ascending = true)
{
	T tVal;
	if(Ascending)
	{
		for(int i=0;i<size-1;i++)
		{
			for(int j=i+1;j<size;j++)
			{
				if(arry[i]>arry[j])
				{
					tVal = arry[i];
					arry[i]= arry[j];
					arry[j]=tVal;
				}
			}
		}
	}
	else
	{
		for(int i=0;i<size-1;i++)
		{
			for(int j=i+1;j<size;j++)
			{
				if(arry[i]<arry[j])
				{
					tVal = arry[i];
					arry[i]= arry[j];
					arry[j]=tVal;
				}
			}
		}
	}
}

快速排序法:

/*
//快速排序法
int len=100;
float* arry= new float[len]();
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
	arry[i]=rand();
}
QSort(arry,0,len-1,true);
delete[] arry;
*/
template<typename T>
void QSort(T* arry,int left,int right,bool Ascending = true)
{
	int l,r;
	T t,m;
	l=left;
	r=right;
	m=arry[(left+right)/2];

	if(Ascending)
	{
		while(l<r)
		{
			while(arry[l]<m)l++;
			while(arry[r]>m)r--;
			if(l>=r)break;

			t=arry[l];
			arry[l]=arry[r];
			arry[r]=t;

			if(arry[l]!=m)l++;
			r--;
		}
	}
	else
	{
		while(l<r)
		{
			while(arry[l]>m)l++;
			while(arry[r]<m)r--;
			if(l>=r)break;

			t=arry[l];
			arry[l]=arry[r];
			arry[r]=t;

			if(arry[l]!=m)l++;
			r--;
		}
	}

	if(l==r)l++;
	if(left<r)QSort(arry,left,r,Ascending);
	if(l<right)QSort(arry,l,right,Ascending);
}

两种算法在数据量较小时差异不大,但是如果数据量达到上万条,两者的差异非常大,快速排序法在几毫秒内完成的工作冒泡法需要几十秒甚至更长。

下面列出对快速排序法的一些应用:

1.协同排序

/*
//协同排序,参照数组1对数组1和数组2排序,默认为升序排列
int len=100;
float* arry1= new float[len]();
float* arry2= new float[len]();
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
	arry1[i]=rand();
	arry2[i]=rand();
}
QConsortSort(arry1,arry2,0,len-1,true);
delete[] arry1;
delete[] arry2;
*/
template<typename TA,typename TB>
void QConsortSort(TA* arry1,TB* arry2,int left,int right,bool Ascending=true)
{
	int l,r;
	TA ta;
	TB tb;
	l=left;
	r=right;
	TA m=arry1[(left+right)/2];
	if(Ascending)
	{
		while(l<r)
		{
			while(arry1[l]<m)l++;
			while(arry1[r]>m)r--;
			if(l>=r)break;

			ta=arry1[l];
			arry1[l]=arry1[r];
			arry1[r]=ta;

			tb=arry2[l];
			arry2[l]=arry2[r];
			arry2[r]=tb;

			if(arry1[l]!=m)l++;
			r--;
		}
	}
	else
	{
		while(l<r)
		{
			while(arry1[l]>m)l++;
			while(arry1[r]<m)r--;
			if(l>=r)break;

			ta=arry1[l];
			arry1[l]=arry1[r];
			arry1[r]=ta;

			tb=arry2[l];
			arry2[l]=arry2[r];
			arry2[r]=tb;

			if(arry1[l]!=m)l++;
			r--;
		}
	}

	if(l==r)l++;
	if(left<r)QConsortSort(arry1,arry2,left,r,Ascending);
	if(l<right)QConsortSort(arry1,arry2,l,right,Ascending);
}

2.参照排序

//参照排序,参照数组1,对数组2进行排序
//排序后数组1不发生变化,数组2的顺序改变,使用快速排序法实现
template<typename T>
void QAccordingSort(T* arry1,T* arry2,int size,bool Ascending=true)
{
	int* ids = new int[size];
	for(int i=0;i<size;i++) ids[i] = i;
	QAccordingSort(arry1,ids,arry2,0,size-1,Ascending);
	delete[] ids;
}


//参照排序,参照数组1,对数组2进行排序
//排序后数组1不发生变化,数组2的顺序改变,使用快速排序法实现
//tIds是一个为了实现算法而添加的辅助数组,其初始值就是0,1,2...,size-1,用于存储arry1排序后的顺序
template<typename T>
void QAccordingSort(T* arry1,int* tIds,T* arry2,int left,int right,bool Ascending = true)
{
	int l,r,t;
	T m,tT;
	l=left;
	r=right;
	m=arry1[tIds[(left+right)/2]];

	if(Ascending)
	{
		while(l<r)
		{
			while(arry1[tIds[l]]<m) l++;
			while(arry1[tIds[r]]>m) r--;
			if(l>=r) break;

			t = tIds[l];
			tIds[l] = tIds[r];
			tIds[r] = t;

			tT = arry2[l];
			arry2[l] = arry2[r];
			arry2[r] = tT;

			if(arry1[tIds[l]]!=m) l++;
			r--;
		}		
	}
	else
	{
		while(l<r)
		{
			while(arry1[tIds[l]]>m) l++;
			while(arry1[tIds[r]]<m) r--;
			if(l>=r) break;

			t = tIds[l];
			tIds[l] = tIds[r];
			tIds[r] = t;

			tT = arry2[l];
			arry2[l] = arry2[r];
			arry2[r] = tT;

			if(arry1[tIds[l]]!=m) l++;
			r--;
		}
	}

	if(l==r) l++;
	if(left<r) QAccordingSort(arry1,tIds,arry2,left,r,Ascending);
	if(l<right) QAccordingSort(arry1,tIds,arry2,l,right,Ascending);
}
3.索引排序

/*
//对数组进行排序,排序结果以数组索引号的方式输出
//使用快速排序法实现
int len=100;
float* arry= new float[len]();
int* ids = new int[len];
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
	arry[i]=rand();
	ids[i]=i;
}
QIndexSort(arry,ids,0,len-1,true);
delete[] arry;
delete[] ids;
*/
template<typename T>
void QIndexSort(T *tVals,int *tIds,int left,int right,bool Ascending = true)
{
	int l,r,t;
	T m;
	l=left;
	r=right;
	m=tVals[tIds[(left+right)/2]];

	if(Ascending)
	{
		while(l<r)
		{
			while(tVals[tIds[l]]<m) l++;
			while(tVals[tIds[r]]>m) r--;
			if(l>=r) break;

			t = tIds[l];
			tIds[l] = tIds[r];
			tIds[r] = t;

			if(tVals[tIds[l]]!=m) l++;
			r--;
		}		
	}
	else
	{
		while(l<r)
		{
			while(tVals[tIds[l]]>m) l++;
			while(tVals[tIds[r]]<m) r--;
			if(l>=r) break;

			t = tIds[l];
			tIds[l] = tIds[r];
			tIds[r] = t;

			if(tVals[tIds[l]]!=m) l++;
			r--;
		}
	}

	if(l==r) l++;
	if(left<r) QIndexSort(tVals,tIds,left,r,Ascending);
	if(l<right) QIndexSort(tVals,tIds,l,right,Ascending);
}


VB.NET二维数组快速排序(更新) VB.NET二维数组快速排序(更新) 'OldArrays(),为排序二维数组;NewArrays(),为存放结果数组,SortColumnsOrOrders(),传递排序参数数组,偶数个为排序列号,奇数为升降序,0为升序,1为降序;FieldRow,是否有字段行(第一行),true为有字段行,false为无字段行,默认为无字段行;TotalRow,是否有统计行(最后一行),true为有统计行,false为无统计行,默认为无统计行; 立即下载

相关推荐

vb 简单快速排序

vb.net 语言 开发的简单快速排序,里面附带工程文件,打开便可以运行,附带截图!用Visual Studio 2010 以上版本打开

快速排序算法及其应用

常见的排序算法 冒泡排序,简单排序,插入排序等算法时间复杂度为 n^2,在某些场景下如已知有序的数组中进行排序,调用这些算法可以有效地完成排序功能。 其源码如下: /************************************************ * title : 交换 * 算法复杂度 : ************************************************/ void swap(SqList *L,int i,int j) { int temp

su_fei_ma_su的博客 972

潜行游戏设计:核心机制与关卡设计解析

潜行游戏作为动作游戏的重要分支,通过视觉遮蔽、声音传播和AI行为树等复杂系统,为玩家提供独特的策略体验。视觉隐蔽系统采用视野锥和光照值的双重判定,声学传播模型模拟距离衰减和材质穿透,而敌人AI行为树则包含巡逻、警戒和团队协作等状态节点。这些技术不仅提升了游戏的真实感和挑战性,还在《合金装备》《刺客信条》等经典作品中得到广泛应用。潜行游戏的关卡设计强调多路径拓扑结构和环境叙事元素,通过沙漏模型和动态难度调节,平衡自由度和开发成本。未来,基于ML的适应性AI和物理模拟的隐蔽系统将成为创新方向。

weixin_42497762的博客 179

786. 第k个数 【快速排序】

题目 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第 k 小数。 数据范围 1≤n≤100000, 1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样例: 3 题解 快速选择 #include <iostream> using namespace std; const int

午夜的行人 791

Simulink实战:5步搞定固定翼飞行器六自由度动力学建模(附模型下载)

本文提供了一份详细的Simulink实战指南,通过5个核心步骤手把手教你构建固定翼飞行器的六自由度动力学模型。内容涵盖从顶层架构设计、核心方程手动实现,到模型集成、测试调试及进阶优化的完整流程,旨在帮助航空航天学生和工程师将抽象理论转化为可运行的仿真模型,并附有模型下载。

perl8的博客 634

SRAM compiler中Power Gating与Retention的实战配置指南

本文深入解析了在SRAM compiler中配置Power Gating(电源门控)与Retention(数据保持)功能的实战指南。针对低功耗芯片设计,文章详细阐述了如何根据应用场景(如移动AP、IoT设备)权衡开关类型、尺寸、唤醒时序以及保持电压,以实现静态功耗优化与数据可靠性的最佳平衡,并强调了后端实现与签核检查的关键要点。

weixin_29204121的博客 294

快速排序及其应用

快速排序被称为是20世纪10大算法之一,可见其重要性,不明觉厉。 学习快速排序不单单只是一种排序算法,更重要的是其中包含的思想,分治思想。 下面进入正题,本文将给出多种快速排序的方法,并给予评价。 快速排序的思想是分治,分而治之,和归并排序一样,我们将大问题分解同小规模的具有相同解法的小问题。 快速排序的重点在分,归并侧重“并”,所谓分,指的是找到一个位置,这个位置的数将序列划分成两部分,左边比它...

木心算法 2105

【第33话:车辆控制】自动驾驶车辆运动学模型推导及详解

自动驾驶车辆的运动学模型以自行车模型为核心,通过状态方程。

一碗白开水一 831

快速排序算法及其思想的应用(寻找一个序列中第k小元素)

快速排序的本质就是通过特定的算法将一段无序的数列分割成独立的两部分,再对这两部分采用同样的算法递归处理,最终使得序列有序。 关键就在于这个特定的算法,具体实现起来,我们可以取序列中任意一个元素作为媒介,并把比其小的数字放在这个元素左边,把比其大的数字放在右边。 由于可以选取任意的元素作为媒介,所以快速排序就有了很多种不同的类型。 其中比较常见的就是把中间元素或第一个元素作为媒介。 第一种快排:把中间元素作为媒介 核心代码: 前面一部分主要是实现以第(l+r)/2 个元素作为媒介, 并将比其小的元素放在前面,

qq_50748356的博客 3548

海德汉机床采集数据

海德汉数控系统我一般在高端机床上见得比较多。有好多五轴加工精度比较高的机床都用的是海德汉的系统。市面上常见的有530和640等型号。海德汉的采集还是有点难度的,需要对SDK有深度的了解。

若云流风的专栏 1526

PCL CSF布料模拟算法【2026最新版】

CSF布料模拟地面滤波算法的PCL实现,博客长期更新,本文最近更新时间为:2026年10月26日。

点云侠的博客 3917

【快速排序算法思想及其应用】

快速排序算法作为一种高效且稳定的排序算法,通过选取一个基准元素并将待排序序列划分为小于基准元素和大于基准元素的两部分来实现排序。尽管快速排序在处理非常大规模数据或完全无序的情况下性能可能有所不足,但在处理中等规模或大规模数据集时,它是一种简单且高效的排序方法。在实际应用中,根据具体需求选择合适的排序算法,如快速排序、归并排序等,以提高程序的性能和可维护性。

我是Java程序员廖志伟,感谢朋友们的支持! 1133

鸢尾花分类预测

鸢尾花数据总用有150个样本,是一个典型的分类数据集,共有3个类别,分别是山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica),每个样本的特征有4列sepal_length:萼片长度sepal_width:萼片宽度petal_length:花瓣长度petal_width:花瓣宽度这里我们定义了随机森林模型作为实例,来进行模型训练,之后我们会对其使用网格搜索找到最优的参数。

优快云 精品推荐 2188

快速排序 (挖坑法)+partion函数的应用

快速排序+挖坑法+第K大数应用+堆排序解决第k大数问题 ...

WSTONECH的博客 2316

GEE:面对对象土地利用分类(结合SNIC、GLCM 和机器学习算法)

本文将介绍在Google Earth Engine中结合SNIC、GLCM和机器学习算法的的土地利用/土地覆盖(LULC)分类方法。结果如下图所示,

养乐多的博客 5614

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

快速排序法应用

快速排序法的基本思路:有n个无序数据,以第1个数据为基准,比该数据小的数据放到它左边,比该数据大的数据放到其右边。然后对这两部分数据继续进行这样的排序,直到每个部分为空或者只有一个数据时,排序结束。

weixin_40731060的博客 142

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数组与集合的应用之数组排序与查询(使用快速排序法)

数组与集合的应用之数组排序与查询(使用快速排序法)

TengLinhui的博客 354

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【每日一算法】快速排序算法 | 模板&应用

💡快速排序: - 在以往的《数据结构与算法》的栏目的中,我们有很详细地介绍了: 【快速排序的算法原理&三种常见的实现模板】 - 我们自己模拟实现快排不仅是为了让我们对其算法思想更加深刻,也是在不断锻炼我们的算法思维以及为面试中`手撕快排`做准备 - 而真正在做算法题目中,除非题目要求我们去实现快排,我们一般都可以直接采用C

Dream_Y.ocean的博客 1126

快速排序算法思想及其优化

前言:快速排序算法是一种排序执行效率很高的排序算法,平均时间复杂度为O (nlogn),明显优于其他排序算法。而且各大互联网公司会高频率问到的快速排序,所以有必要好好学习一下。 一、排序算法简介 1、排序算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。..

何哥的博客 6781

Java编程入门与应用 P192 例7-25——快速排序法(非完全书上,而是更具书上思想自编写)

Java编程入门与应用 P192 例7-25——快速排序法(非完全书上,而是更具书上思想自编写) 程序入口: /** * Java编程入门与应用 P192 例7-25——快速排序法(非完全书上,而是更具书上思想自编写) */ public class quick_sort { //定义一个算法类 public static void main(String[] args) { //定义初始数组 int[] number = {13, 15, 24, 9

乖珑珑的博客 133

Python算法实现(一)—— 快速排序算法

快速排序是我们在面试时常常遇到的算法,我们接下来首先介绍快速排序的基本思想,然后手撸一遍快速排序算法,最后我们介绍一些特殊情景的应用。 快速排序介绍 快速排序算法是冒泡排序算法的一种改进,其主要思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分所有数据小,整个过程可以递归进行,最终使整个数据变成有序序列。但快速排序是一种不稳定的排序算法,即相同元素不能保序,因此在一些实际场景中不能进行使用。 快排实现步骤 在数据集之中,选择一个元素作为“基准”(pivot) · 可以选择第

ChenKai_164的博客 1166

数据结构-栈(应用篇)之快速排序法-C和C++的实现

一、原理解析 快速排序法: 基本思路是,从第一个元素开始,把所有比它大的元素放在它后面,把所有比它小的元素放前面。然后划分它前面和后面的所有元素,分别再做快速排序,直到无法再划分为止。 在以下程序案例中我们使用非递归的方式,并借助栈的数据结构实现。(关于栈的基本介绍,请看上一篇:http://www.cnblogs.com/HongYi-Liang/p/7766684.html) ...

weixin_30243533的博客 402

数据结构与算法实战(六)快速排序法

数据结构与算法实战(六)快速排序法 一、原理 QuickStart(arr, l, r){ if(l >= r) return; int p = partition(arr, l, r); //对arr[l, p - 1]进行排序 QuickStart(arr, l, p-1); //对arr[p + 1, r]进行排序 QuickStart(arr, p + 1, r); } 二、基础的Partition实现 pr

qq_43533806的博客 950

快速排序(挖坑法)

采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。

D143635的博客 666
上一篇: GDAL生成灰度和彩色缩略图
下一篇: 如何生成IStyleGalleryItem和ISymbol对象的预览图
深蓝静音
博客等级 码龄17年 263粉丝 68原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

深蓝静音

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值