常见的排序算法(三) 交换排序(冒泡排序,快速排序)

交换类排序(内有经典的冒泡排序和快速排序C++代码实现) 讲解了交换类排序的含义,并有代表:冒泡排序和快速排序的算法实现和讲解,和复杂度分析。 立即下载

 今天,给大家带来的是交换排序。

  首先,我们来了解一下什么叫交换排序。所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

  那么接下来,我们来看一下。冒泡排序。


冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。


冒泡排序算法的运作如下:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。


冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以冒泡排序是一种稳定排序算法。

void BubbleSort(int* a,int size)   //冒泡排序
{
	for(int j= 0;j<size-1;j++)
	for(int i = 0;i<size-j-1; i++)
	{
		if(a[i]>a[i+1])
		swap(a[i],a[i+1]);
	}
}



  接下来就是比较难懂的快速排序了。

  首先,我们的了解什么事快速排序。

  快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序有递归写法和非递归写法。首先,我为大家介绍的递归的写法。

int Mid(int* a,int left,int right)
{
	int key = a[right];
	int begin = left;
	int end = right;
	while(begin <end)
	{
		while(begin <end && a[begin] <=key)
			begin++;

		if(begin <end)
                 a[end--] =a[begin];

		while(begin <end && a[end] >=key)
			end--;

		if(begin <end)
		 a[begin++] =a[end];	
	}
	
	a[begin] = key;
	return begin;
	
}


void QuickSort(int* a,int left ,int right)  //快速排序
{
	
	if(left >= right)
		return;

	int indix = Mid(a,left,right);
	QuickSort(a,left,indix-1);
	QuickSort(a,indix+1,right);
	
}

以上的方式,便是最常见的快速排序的递归写法。

下面的另外一种是《算法导论》中所提及的方法,读者可以看看

int QuickSort_OR(int* a,int left ,int right)
{
	int prev = left - 1;
	int cur = left;
	int key = a[right];
	for(;cur <= right; cur++)
	{
		if(a[cur] <= key )
		{
			++prev;
			swap(a[prev],a[cur]);
		}
	}

	return prev;

}


void QuickSort(int* a,int left ,int right)  //快速排序
{
	
	if(left >= right)
		return;

	int indix = QuickSort_OR(a,left,right);
	QuickSort(a,left,indix-1);
	QuickSort(a,indix+1,right);
	
}

从以上的两种方法便可以看出,在快速排序中找到KEY的值是至关重要的,故而有人提出了优化。

int RandPartition(int* a, int left , int right)  //三数取中
{    
	assert(a);
	int mid = left + (right-left)/2;
	if(a[left]<a[mid])
	{
		if(a[mid] < a[right])
			return a[mid];
		else if(a[left] > a[right])
			return a[left];
		else
			return a[right];
	}
	else     //
	{
		if(a[mid]> a[right])
			return a[mid];
		else if(a[left] > a[right])
			return a[right];
		else
			return a[left];

	}
}

这样就可以极大的减少key取到最大或者最小的情况,更加有利于快速排序。

但是,当区间很小的时候,还要递归,这样不仅浪费资源,还使得运算速度变慢,故而有人便想到了,当区间小于某个程度是,我们是否可以用其他的排序来代替它呢?故而,又有一种优化

void QuickSort(int* a,int left ,int right)  //快速排序
{
	if(right - left<13)
		InserSort(a,right-left);
	else
	{
	if(left >= right)
		return;

	int indix = Mid1(a,left,right);
	QuickSort(a,left,indix-1);
	QuickSort(a,indix+1,right);
	}
}

当区间小于13时便可以调插入排序(若不知道插入排序,请看本人博客(一))




非递归方法

void QuickSort_no(int* a,int left,int right)
{
     assert(a);
     stack<int> s;
     s.push(left);//压栈数组的左下标
     s.push(right);//压栈数组的有下标
    while (!s.empty())
  {
           int tmpRight = s.top();
             s.pop();
            int tmpLeft = s.top();
              s.pop();  
	int div = Mid1(a, tmpLeft, tmpRight);//把数组排序成左区间的数小于等于有区间的数
 
            if (tmpLeft < div - 1)
           {                                    //压栈左区间的左右两个数的下标
                   s.push(tmpLeft);
                    s.push(div - 1);
            }
         
             if (div + 1 < tmpRight)
          {
                   s.push(div + 1);     //压栈右区间的左右两个数的下标
                    s.push(tmpRight);
           }
   }
  
}

以上方法是通过栈的方式实现的,注释已经详细说明。


若想视觉感受各排序算法http://blog.jobbole.com/11745/


如果想对快速排序有进一步的了解和加深的同学,可以看看http://dsqiu.iteye.com/blog/1707060


这篇博文列举了交换排序,基本可以掌握其中概要,管中窥豹,不求甚解。如果你有任何建议或者批评和补充,请留言指出,不胜感激,更多参考请移步互联网。

冒泡排序(Bubble Sort) 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 立即下载

相关推荐

C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解)

C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解) 大家好,我是菌菌巧乐兹,励志用最简单的语言来讲解程序知识点。

菌菌兹的博客 1669

java实现十大经典排序(一)冒泡排序

一、什么是冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 二、算法稳定性 冒泡排序就是把小的元素往前调或者把大的元素

一个胖子IT男的博客 964

超详细版!Obsidian+Claude+Skills+云同步,打造智能 AI 知识库

本文介绍如何搭建高效的AI知识管理系统,将Obsidian笔记工具与ClaudeAI助手深度整合。通过ClaudeCode安装配置、ObsidianSkills插件添加和坚果云同步设置,实现本地存储安全性与云端便捷性的完美结合。该系统支持智能笔记整理、知识图谱可视化、智能搜索问答和内容创作辅助等功能,使静态笔记转变为能自动分析关联、处理复杂结构的"活"知识库。详细步骤包括工具准备、环境配置、插件安装和云同步设置

2301_79998006的博客 1084

排序算法之交换排序( 冒泡排序 & 快速排序(三种实现方法及其优化,非递归) ) ( C语言版 )

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡...

【Dyson】的博客 906

J-Flash手动添加华大HC32F460型号全攻略

在嵌入式开发中,Flash编程算法是连接调试工具与微控制器的重要桥梁,它定义了芯片存储器的擦除、编程和校验等底层操作规范。其原理是通过调试接口将算法代码加载到目标芯片的RAM中执行,从而实现对Flash存储器的访问与控制。这项技术的核心价值在于打破了工具链对芯片型号的固有支持限制,使得开发者能够灵活适配各种新兴或定制化的微控制器。在工程实践中,当面对J-Link等主流调试器官方支持包更新滞后时,手动添加芯片型号成为保障开发效率的关键技能。本文以华大半导体的HC32F460系列MCU为例,详细解析了如何通过配

weixin_29192365的博客 353

C# 与 TensorFlow.NET:深度神经网络构建与优化的终极指南

是一个由开源社区维护的 C# 库,它将 TensorFlow 框架的强大功能带到了 C# 开发者的手中。TensorFlow 本身是 Google 开发的一个机器学习框架,广泛应用于深度学习、强化学习等领域。通过 TensorFlow.NET,C# 开发者无需切换语言环境,可以直接在 C# 中构建、训练和优化深度神经网络模型。首先,我们需要定义一个神经网络。该网络将包含输入层、隐藏层和输出层。// 输入张量(XOR 输入,2 个特征)// 输出张量(标签,1 个输出)// 定义第一个隐藏层。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1457

常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)

冒泡排序算法: 总的来说就是两两交换,反复直到有序,第一个记录和第二个记录,若逆序则交换,然后比较第二个和第三个记录,以此类推,直到第 n 个记录和第 n-1个记录比较完毕为止,第一趟排序,结果关键字最大的记录被安排在最后一个位置。对前 n-1个记录继续冒泡排序,使得关键字次大的记录安排在第 n-1个位置。如此重复,直到没有需要交换的记录为止(仅仅是第一个和第二个交换过为止)。整个一趟...

diaoyanqin5061的博客 1341

混合动作空间在强化学习中的创新应用:PDQN与MPDQN算法解析

本文深入解析了强化学习中处理混合动作空间的PDQN与MPDQN算法。针对既有离散选择又有连续调节的复杂决策场景,PDQN通过参数化深度Q网络,巧妙结合DQN与DDPG进行交替优化;MPDQN则进一步改进,为每个离散动作提供专属参数评估以减少干扰。文章通过游戏、自动驾驶等实例阐述了其应用价值与面临的挑战。

efc123456的博客 864

交换排序(冒泡排序,优化冒泡排序,快速排序,以及快速排序优化的三种方法详解)

交换排序:利用交换元素的位置进行排序的方法称为交换排序。常用的交换排序有冒泡排序和快速排序。 冒泡排序算法: 基本思想:n个元素,序列进行N-1次循环,依次比较相邻两个元素的大小,如果array[i]&gt;array[i+1],则交换两个元素,反之则不交换。这样每次循环都能比较出数值最大的那个元素。 最好最坏情况: 最好情况是正序,时间复杂度是O(N),比较次数为n-1次 ...

suoyudong的博客 1966

未来智能家居解决方案:AI应用架构师的前沿探索

当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。

AI天才研究院 1411

UG\NX二次开发 分割曲线

分割曲线没有ufun函数?那就换一种思路实现。

王牌飞行员_里海的博客 1148

【排序算法(三)】交换排序(冒泡排序&&快速排序)

今天我们认识并具体学习了交换排序算法中的冒泡排序和快速排序,通过这次的学习,我们也感受到了快速排序的魅力。下一篇博客,我们将继续学习排序算法中的归并排序。希望我的文章和讲解能对大家的学习提供一些帮助。

Sherry的博客 503

MATLAB 与 STK 互联导出导弹轨迹及速度数据(csv导出)

本文介绍了如何通过 MATLAB 脚本连接 STK 提取导弹三维轨迹数据,并以 CSV 格式导出,包含以下关键内容:自动连接 STK 场景;获取所有导弹对象;提取 J2000 坐标系下的位置和速度;加入任务优先级与状态;导出为标准 CSV 文件;

weixin_52370774的博客 781

排序算法(三):交换排序(冒泡排序、快速排序的递归与非递归)

交换排序 基本思想: 所谓交换,就是根据序列中两个元素键值的比较结果来交换这两个元素在序列中的位置,将键值较大的元素向序列的尾部移动,键值较小的元素向序列的前部移动。 排序分类: 交换排序分为冒泡排序和快速排序 一:冒泡排序 排序过程: ...

Outtch_的博客 408

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

WINCC7.3破解文件

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

排序算法(三)交换类排序:冒泡排序和快速排序

交换类排序的基本思想:通过一系列交换逆序元素进行排序的方法。冒泡排序冒泡排序的基本思想:顾名思义就是像冒泡一样,两两比较,将大值(小值)后移,最后最大值或最小值排到最后。优化:数据是有序的,在遍历一次时没有交换数据,所以数据是有限的,可以设置一个标记为flag//冒泡排序优化,定义一个标志器, void BubbleSort_P(int arr[], size_t size) { bool

菜鸟成长记 1420

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

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

排序算法(三):交换排序(冒泡排序、快速排序)

一、冒泡排序1.算法思想 冒泡排序是一种极其简单的排序算法。它重复地走访过要排序的元素,依次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。2.具体算法描述 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步

Amber的博客 572

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【七大排序算法(三)】之交换排序(冒泡排序,快速排序详解,代码,常见错误等9000字巨详细)

七大排序第三篇之交换排序,本文详细讲解了关于交换排序中的冒泡排序、快速排序;其中包括动图,代码,代码分部讲解以及每一步的图解,巨详细!!!,尤其是快速排序,三种方法、递归与非递归实现,不断优化算法、欢迎有需要的小伙伴阅读。

m0_54469145的博客 801

排序算法(三)、交换排序 —— 冒泡排序 和 快速排序

1、冒泡排序C 程序如下:// 冒泡排序 void sort2(int a[], int n) { for (int i = 0; i &lt; n - 1; i++) { for (int j = 0; j &lt; n - 1- i ; j++) { if (a[j] &gt; a[j + 1]) { swap(a[j], a[j + 1]); ...

denghe优快云的博客 509

七大排序算法详解——排序(三)交换排序(冒泡排序、快速排序,附Java代码)

排序:所谓排序,就是使一串记录,按照其中的某个或某几个关键字的大小,递增或递减排列起来的操作。稳定性:在待排序的记录序列中,存在多个具有相同关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这种排序算法是稳定的。内部排序:把数据全部加载到内存中进行排序。外部排序:数据太多,内存不能存储了,将数据放到磁盘、U盘上进行排序。

m0_63793861的博客 240

【初阶数据结构与算法】八大排序算法之交换排序(冒泡排序,快速排序---hoare、挖坑法、lomuto双指针3种版本)

快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两⼦序列,左⼦序列中所有元素均⼩于基准值,右⼦序列中所有元素均⼤于基准值,然后最左右⼦序列重复该过程,直到所有元素都排列在相应位置上为⽌大致含义就是,快排的主要思路就是将一个数组按照给定的基准值不断分成两截,然后对它们进行处理,将所有小于基准值的放在在基准值的左边,大于基准值的放在基准值的右边,最好的情况下可以二分进行排序,非常高效。

hdxbufcbjuhg的博客 3300

排序算法-交换排序

由于冒泡排序只在相邻元素大小不符合要求时才调换他们位置,它并不改变相应元素之间的相对顺序,因此他是稳定的排序算法。

weixin_39392044的博客 819

交换排序(冒泡、快速、三划分排序)

#include <iostream> #include "iomanip" using namespace std; /* 思想:从第0个元素开始依次扫描整个序列, 工作指针为i,其代表着位置为i的最小元素。 而j指针从末尾依次选出最小值。 即:进行n-1趟,每趟都让最大或最小值在队列的最末端或最前端。 */ void BubbleSort(int a[], int n...

weixin_42822489的博客 226

PHP 常见4种排序 冒泡排序、选择排序、插入排序、快速排序

1、冒泡排序 原理:对一组数据,比较相邻数的大小,将值大的放到后面。 &lt;?php // 冒泡排序 function bubbleOrder($arr) { $count = count($arr); $temp = 0; // 外层控制排序次数 for ($i = 0; $i &lt; $count - 1; $i++) { // 内层控制...

Dafei4的博客 346

【数据结构之八大内排序】交换排序(冒泡排序,快速排序)

第一部分:交换排序

410
上一篇: 常见的排序算法(二) 选择排序
下一篇: 常见的排序算法(四)( 归并排序,计数排序 , 基数排序)
Csoul89757
博客等级 码龄10年 34粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值