快速排序的三种实现方法 (C++)

C++十种排序方法(快速排序、冒泡排序等等) C++十种排序方法(快速排序、冒泡排序等等) 一、冒泡排序 1、概念及思路:冒泡排序顾名思义就是大的数沉下去,小的数浮上来,就跟气泡在水底浮上来一样;基本的思路很简单,就是相邻的两个数相比较,如果前面那个数比后面那个数大,则换位置,否则不需要换。以此循环下去(这里指的是从小到大排序,当然也可以从大到小) 2、代码演示: #include<iostream> using namespace std; int main() { int i; int arr[10] = { 1,5,2,3,6 阅读详情

快速排序的中心思想

       快速排序利用的是分治思想,将一个大数组的排序划分为多个小数组的排序,最后进行合并便是排序的结果。

      首先,需要从数组中选择一个主元,通常为数组的第一个元素或最后一个元素(好操作)。接下来的工作就是要将数组中的其他元素与主元进行对比,小于主元的元素放在主元的左边,大于主元的元素放在主元的右边。

      例如有数组 A[begin...end] 经过上述步骤后会得到A[begin...q-1], A[q], A[q+1...end]

      其中A[q]为主元,子数组 A[begin...q-1] 的所有元素小于主元,子数组A[q+1...end] 的所有元素大于主元。

      此时,能确定的就是A[q]的位置,并且该位置就是最终排序后A[q]的位置,不会再变。

      接下来要做的就是让两个子数组A[begin...q-1], A[q+1...end]重复上述步骤,直到每个子数组只剩一个元素,此时就是最终排序完成的数组。


      中午突然发现忘掉了快速排序的具体实现过程,下午赶快找空闲时间写一次。

      快速排序有很多种方法,首先我们要了解的是快速排序创始人 C. A. R. Hoare 的实现方法。

一. 快速排序1

      比如有数组{3,8,4,9,2,7,1},选择3为主元,有两个变量i,j 分别从数组头尾向中间滑动,每当j从尾开始找到小于主元的元素时停止,换i从头查找大于主元的元素,找到两个元素后交换两个元素的位置,直到i和j相等。(也可以用相反的方式,最终得到逆序的数组)

       例如{3,8,4,9,2,7,1},主元为3,j从尾搜索直到A[j]=1停止,i从头搜索直到A[i]=8停止,交换位置。

          →{3,1,4,9,2,7,8},接下来,j会一直搜索直到A[j]=2,i搜索到A[i]=4,交换位置。

          →{3,1,2,9,4,7,8},之后,j会搜索到j=i,此时交换主元和位置i的元素,也就是3和2。

          →{2,1,3,9,4,7,8}   这便是经过一次排序操作后的结果,主元3左边的子数组{2,1}全部小于主元,右边的子数组{9,4,7,8}全部大于主元。之后再对子数组进行相同的操作,直到最终排序完成。

二. 快速排序2

      这种排序方式是算法导论第三版书中的方法,与第一种方法类似(其实都差不多,思路相同实现方式不同而已)。

      同样使用{3,8,1,9,2,7,4},选择4为主元,有两个变量i,j 用来维持一段大于主元或小于主元的数组A[i+1,j],最后将主元与A[i+1]交换。

        比如有{3,8,1,9,2,7,4},主元为4,令i+1指向3,j指向3,j向后移动,每当遇到小于主元的数便会与位于i+1的元素交换,直到最后,此时i到j之间所有元素均大于主元,此时交换主元与i处的元素。

        例如{3,8,1,9,2,7,4},主元为4,i与j指向3,i+1后移指向8,j后移直到1,此时此时交换1和8.

           →{3,1,8,9,2,7,4},之后i不变,用来控制大于主元数组的头部,j后移直到A[j] = 2,交换2和8.

           →{3,1,2,9,8,7,4},此时i+1指向9,之后直至结束没有变化,交换i+1和主元。

           →{3,1,2,4,8,7,9},这便是经过一次排序操作后的结果,主元4左边的子数组{3,1,2}全部小于主元,右边的子数组{8,7,9}全部大于主元。之后再对子数组进行相同的操作,直到最终排序完成。(过程中i与j之间的元素全部大于主元)

三.快速排序3

        这种排序方式是上课时讲到的方法,这种方式主元不再是最后才进行移动。而是在比较过程中移动。

        比如有{3,8,1,9,2,7,4},令主元为3,有两个变量i与j,分别从头尾向中间进行扫描。这种方法是令j从尾向前扫描,知道遇到比主元小的元素,此时交换该元素与主元;之后令i从头开始扫描,直到遇到比主元大的值,交换该值与主元,最终得到结果便是一个元素均大于主元的子数组和一个元素均小于主元的子数组,并且此时主元所在的位置就是最终排序后该元素应在的位置。

        例如{3,8,1,9,2,7,4},主元为3,i指向头,j指向尾,j开始向前扫描,直到j指向2,交换2和3.

           →{2,8,1,9,3,7,4},之后i从头开始扫描,直到i指向8,交换8和3.

           →{2,3,1,9,8,7,4},之后j从上次j扫描的位置继续扫描,直到j=1,交换1和3.

           →{2,1,3,9,8,7,4},直至结束不再变化。这就是经过一次排序后的结果,主元3左边元素均小于3,右边元素均大于3。之后再多两边的子数组进行相同的操作,直到排序完成。



        下面是这三种方式的实现代码.

#include <iostream>
using namespace std;

int len = 0;		//数组长度

/**************************************    输出函数    ********************************************/
void _show(const int a[])
{
	for(int i=0;i<len;i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}
/**************************************    交换次序函数  ********************************************/
void swap(int *a,int i,int j)
{
	int temp;
	temp = a[i];
	a[i]= a[j];
	a[j] = temp;
}
/**************************************    快速排序1   ********************************************/
int _partition(int a[], int p, int r)
{
	int x = a[r];
	int i = p-1;
	for(int j=p;j<=r-1;j++)
	{
		if(a[j]<=x)
		{
			i=i+1;
			swap(a,i,j);
		}
	}
	swap(a,i+1,r);
	return i+1;
}
void _firstsort(int a[],int first,int last)
{
	int q;
	if(first<last)
	{
		q = _partition(a,first,last);
		_firstsort(a,first,q-1);
		_firstsort(a,q+1,last);
	}
}
/**************************************    快速排序2   ********************************************/
int _hoare(int a[], int p, int r)
{
	int x = a[p];
	int i = p;
	int j = r + 1;

	while(1)
	{
		while(a[--j]>x);
		while(a[++i]<x);

		if(i<j)
			swap(a,i,j);
		else
			break;
	}
	a[p] = a[j];
	a[j] = x;
	return j;
}
void _secondsort(int a[],int first,int last)
{
	int q;
	if(first<last)
	{
		q = _hoare(a,first,last);
		_secondsort(a,first,q-1);
		_secondsort(a,q+1,last);

	}
}
/**************************************    快速排序3   ********************************************/
int _coursep(int a[], int p, int r)
{
	int u = p;
	int d = r;
	while(u<d)
	{
		while(a[u]<a[d]&&u<d)
			u++;
		swap(a,u,d);
		while(a[d]>a[u]&&u<d)
			d--;
		swap(a,u,d);
	}
	return u;
}
void _thirdsort(int a[],int first,int last)
{
	int q;
	if(first<last)
	{
		q = _coursep(a,first,last);
		_thirdsort(a,first,q-1);
		_thirdsort(a,q+1,last);
	}
}

/**************************************     整理输出形式  ********************************************/
void _first(int a[],int first,int last)
{
	cout << "******************************************" << endl;
	cout << "未排序序列:  ";
	_show(a);
	_firstsort(a,first,last);
	cout << "排序后序列:  ";
	_show(a);
	cout << "******************************************" << endl;
}
void _second(int a[],int first,int last)
{
	cout << "******************************************" << endl;
	cout << "未排序序列:  ";
	_show(a);
	_secondsort(a,first,last);
	cout << "排序后序列:  ";
	_show(a);
	cout << "******************************************" << endl;
}
void _third(int a[],int first,int last)
{
	cout << "******************************************" << endl;
	cout << "未排序序列:  ";
	_show(a);
	_thirdsort(a,first,last);
	cout << "排序后序列:  ";
	_show(a);
	cout << "******************************************" << endl;
}


/**************************************     MAIN      ********************************************/
int main()
{
	unsigned int flag = 0;
	unsigned int num = 0;
	cout << "快速排序测试......" << endl << endl;
	
	cout << "输入数组长度: ";
	cin >> len;
	int *arr = new int [len];
	
	cout << "输入数组元素: ";
	for(int i=0;i<len;i++)
	{
		cin >> arr[i];
	}
	
	while(1)
	{
		int *a = new int [len];
		for(int i = 0; i<len; i++)
		{
			a[i] = arr[i];
		}
		cout << "三种快速排序,选择一种(1,2,3, 4退出)" << endl;
		cin >> flag;
		while(flag<1||flag>4)
		{
			cout << "输入错误,重新输入: ";
			cin >> flag;
		}
		switch(flag){
			case 1: _first(a,0,len-1);break;
			case 2: _second(a,0,len-1);break;
			case 3: _third(a,0,len-1);break;
			case 4: return 0;
			default: cout << "未知错误" << endl;
		}
		delete[] a;
	}
	delete[] arr;
	return 0;
}

       本来是想写在小本子上记录下来,后来琢磨着就干脆写到这里吧,希望对算法的初学者们有一个较好的引路作用(希望没有误人子弟)。

       快速排序的解释,包括这段稚嫩的代码,其中一定存在没有解释清楚的地方,或者说不足之处,欢迎看到这篇文章的各位能够提出宝贵意见。


       转载注明出处哦:https://blog.youkuaiyun.com/lazyboy_/article/details/80242736



c++十大排序——快速排序 算法基本知识铺垫 有些人可能不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下: 1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序 2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。 3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储 空间进行比较和交换的数据排序。 4、非原地排序:需要利用额外的数组来辅助排 阅读详情

相关推荐

C语言实现快速排序算法

序 愿天上的每一个流星,都为你而闪耀天际。 嗨,这里是狐狸~~ 今天是

C语言C++学习俱乐部:765860056 3万+

快速排序算法C++实现(超详细解析!!!!)

快速排序,其实是一种分治算法,那么在了解快速排序之前,我们先来看看什么是分治算法。在算法设计中,我们引入分而治之的策略,称为分治算法,其本质就是将一个大规模的问题分解为若干个规模较小的相同子问题,分而治之。

weixin_45031801的博客 11万+

快速排序的几种写法(c++)

快速排序 快速排序一般使用双指针与分而治之的思路来进行排序,所有函数都使用左闭右开区间 快排的时间复杂度:O(NlogN) 空间复杂度:logN 不稳定:排序算法不稳定的定义是如果相等的数发生了交换,那么就不稳定 快排遍历条件含有等于,也就是key值交换后,等于它的可能排在key前面了,所以不稳定,如果一个数组全部相等,快排的效率很低 双边遍历1:双指针相遇 1.选定一个比较点(一般使用第一个元素)key,两个指针first(初始值0),last(初始值:最后一个元素),之所以采用左闭右闭区间,是因为key

photoresist的博客 2515

【排序篇】实现快速排序的三种方法

本文将讲述实现快速排序的3种方法:hoare法,挖坑法,前后指针法

Yui_的博客 1632

怎样在 C 语言中实现快速排序?

快速排序是一种高效的排序算法,在平均情况下具有出色的性能。通过合理的优化,如随机选择基准元素、在小数组时切换到插入排序和使用三路快速排序,可以进一步提高其在各种情况下的效率。在实际应用中,需要根据数据的特点和性能要求选择合适的排序算法和优化策略。🎉相关推荐📙C 语言百万年薪修炼课程通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。🍅博客首页-关注博主🎗️带你畅游技术世界,不错过每一次成长机会!📙优快云专栏-C语言修炼📙技术社区-墨松科技📙C 语言百万年薪修炼课程。

2401_86074221的博客 1154

C++算法之快速排序

将待排序序列按照分界点的值重新排列,使得左边部分小于等于分界点,右边部分大于等于分界点。其主要思想就是将待排序的数组分成两个子数组,然后对这两个子数组分别进行排序,最后将已排序的子数组合并成一个有序的数组。注意上面的quick_sort( )函数是不一样的,在第二个函数里。否则会造成边界问题。同理右边届也存在这种问题。如果没有swap( )函数可以使用。归并排序的主要思想:分治。

m0_74739134的博客 1254

快速排序的三种实现方法及非递归实现快排

快速排序

wuqiongjin的博客 6380

通过C语言实现三种版本的快速排序

快速排序是一种高效的排序算法,通过选取一个“基准”元素,将数组分为两部分:比基准小的元素和比基准大的元素,然后递归地对这两部分进行排序,从而实现对整个数组的排序。该算法平均时间复杂度为O(nlogn),最坏情况下为O(n²),但由于实际应用中很少出现最坏情况,因此快速排序仍然是一种广泛使用的排序算法。快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定。

qq_74013365的博客 2374

用C语言实现快速排序算法

一、快速排序算法(Quicksort) 1. 定义 快速排序由C. A. R. Hoare在1962年提出。快速排序是对冒泡排序的一种改进,采用了一种分治的策略。 2. 基本思想 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 3....

我的博客 20万+

我用 AI 做了个开源地图工具:从 OpenStreetMap 一键获取全国 AOI/POI 数据

本文介绍了一款免费开源的OSM数据查询与可视化工具,旨在解决Overpass QL语法晦涩、数据获取门槛高的问题。工具支持面数据(AOI)、点数据(POI)及路网三种查询模式,内置30+常用模板实现一键检索。具备高德与OSM双底图切换、坐标自动转换功能,支持GeoJSON、SHP、CSV多格式导出,同时保留自定义查询能力。作为纯HTML单文件应用,可零成本部署至GitHub Pages在线使用。该工具有效降低了地理数据获取难度,是替代商业地图API、高效提取全球开源地理信息的实用利器。

weixin_45812624的博客 585

别让IO口保护二极管坑了你!实测讲解单片机电流倒灌的三种典型症状与防护

本文深入解析单片机电流倒灌的三大典型症状与防护方案,重点分析STM32等单片机在ADC采样异常、系统假死和通信速率异常中的表现。通过实测数据和电路设计建议,提供从基础二极管隔离到专业隔离器件的分级防护策略,帮助工程师有效预防和解决电流倒灌问题。

weixin_29280219的博客 344

快速排序原理及三种思路的代码实现(c/c++)

内排序:在排序过程中,所有元素调到内存中进行的排序,称为内排序。内排序是排序的基础。内排序效率用比较次数来衡量。 外排序:在数据量大的情况下,只能分块排序,但块与块间不能保证有序。外排序用读/写外存的次数来衡量其效率。 快速排序是冒泡排序的改进版,也是最好的一种内排序方法。 原理(分治思想): 1.在待排序的元素任取一个元素作为基准(通常选第一个元素),称为基准元素; 2.将待排序的元素...

德prince 1267

NE555构成多谐振荡器及三角波、正弦波的生成(附工程文件)

NE555构成多谐振荡器及三角波、正弦波的生成 续上一篇:NE555基本原理及相关公式的推导

qq_49979053的博客 5万+

快速排序的三种实现及两种优化

一、快速排序的概念快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。二、快排的三种实现方式实现方式一:左右指针法 算法思想:

snow_5288的博客 7096

大模型呼叫中心场景分享之六:大模型外呼IT运维告警——智能监控与自动化响应的未来

在数字化运维(IT Operations)中,实时监控系统健康状态并及时响应告警是保障业务连续性的关键。传统的IT告警方式(如邮件、短信、钉钉/企业微信通知)存在信息过载、响应延迟、人工处理效率低等问题。而大模型(LLM)与语音技术(TTS/ASR)的结合,为IT运维告警提供了更智能的解决方案——大模型外呼告警系统。大模型外呼告警系统正在重新定义IT运维的效率和体验。通过实时语音交互+智能自动化,企业能够将平均故障修复时间(MTTR)从小时级缩短至分钟级。

开源呼叫中心系统FreeIPCC的博客 922

【Android】汽车电源管理:深入解析CarPowerManager与Suspend To RAM的交互机制

本文深入解析了Android Automotive OS中CarPowerManager与Suspend To RAM(深度睡眠)的交互机制。详细阐述了从车辆发出睡眠请求,到CarPowerManagementService协调应用状态,最终通过内核进入低功耗睡眠的完整流程,并探讨了唤醒机制、开发者实践及功耗优化策略,为车机应用开发与系统优化提供关键指导。

weixin_28339967的博客 289

快速排序—C语言实现

🥰在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据,当然操作数据首先想到的就是数据的排序,排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等,这些就是储存数据的方法,下面我们来看一看传说中的快速排序的特点与效率怎么样。😍1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2. 时间复杂度:O(N*logN)3. 空间复杂度:O(logN)4. 稳定性:不稳定。

Yawesh的博客 1451

CCC数字钥匙3.0标准解读(22)

介绍设备制造商服务器和车辆制造商服务器之间的通信协议.

weixin_41738640的博客 1748

C语言实现快速排序

说明 对一个整数序列进行快速排序地方法是:在待排序地整数序列中取第一个数作为基准值,然后根据基准值进行划分,从而将待排序列划分为不大于基准值者(称为左子序列)和大于基准值者(称为右子序列),然后再对左子序列和右子序列分别进行快速排序,最终得到非递减地有序序列。 函数quicksort(int a[],int n)实现了快速排序,其中,n个整数构成地待排序列保存在数组元素a[0]~~a[n-1]...

积跬步,至千里 1万+

如何在 SAP BTP 上使用 Integration Suite 消费 S/4HANA Cloud API

SAP Integration Suite是一个集成平台即服务(iPaaS),允许开发人员顺利地将内部部署和基于云的应用程序和流程与SAP管理的工具和预构建内容进行集成。登录 SAP Business Technology Platform Cockpit,进入 integration suite:再点击 API management 进入 API Portal:或者直接从收藏夹里打开链接:https://304a49cetrial.integrationsuitetrial-apiportal.cfapp

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1698

DICOM图像知识:深入详解DICOM的层级关系

解析DICOM的四个主要层级:Patient(患者)、Study(检查)、Series(序列)和SOP(服务-对象对),探讨它们之间的关系、各自的唯一标识符以及在实际应用中的用途

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 3304

快速排序图解/动画及C语言实现

用C语言实现快速排序

nrxsh 5101

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

8642 快速排序(c++)

8642 快速排序 Description 用函数实现快速排序,并输出每次分区后排序的结果 输入格式 第一行:键盘输入待排序关键的个数n 第二行:输入n个待排序关键字,用空格分隔数据 输出格式 每行输出每趟排序的结果,数据之间用一个空格分隔 输入样例 10 5 4 8 0 9 3 2 6 7 1 输出样例 1 4 2 0 3 5 9 6 7 8 0 1 2 4 3 5 9 6 7...

weixin_43692948的博客 2092

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SAP B1中文培訓教材_SDK

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

下一篇: Go语言实现快速排序
Lazyboy_Chen7
博客等级 码龄9年 29粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值