图解快排——快速排序算法(quick sort)

这篇具有很好参考价值的文章主要介绍了图解快排——快速排序算法(quick sort)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

快速排序算法,数据结构与算法,排序算法,算法,数据结构


算法思想

快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一。
快速排序的基本思想: 通过一趟排序将待排序的序列分割为左右两个子序列,左边的子序列中所有数据都比右边子序列中的数据小,然后对左右两个子序列继续进行排序,直到整个序列有序。
具体实现步骤是这样的,首先从序列中任意选择一个元素,把该元素作为枢轴,然后将小于等于枢轴的所有元素都移到枢轴的左侧,把大于枢轴的元素都移到枢轴的右侧。这样,以枢轴为界,划分出两个子序列,左侧子序列所有元素都小于右侧子序列。枢轴元素不属于任一子序列,并且枢轴元素当前所在位置就是该元素在整个排序完成后的最终位置。这样一个划分左右子序列的过程就叫做快速排序的一趟排序,或称为一次划分。递归此划分过程,直到整个序列有序。

算法图解

首先给出一个无序序列[21, 100, 3, 50, 1],选取一个元素为基准元素,一般选择序列第一个元素21作为枢轴,然后设置两个指针,一个low指针指向左侧第一个位置,一个high指针指向右侧最后一个位置。
快速排序算法,数据结构与算法,排序算法,算法,数据结构
首先取出基准元素21,此时low指向的位置留出一个空位。我们规定,指向空的指针不移动。此时应该操作high指针,如果high指针指向的元素大于基准元素21,那么high指针左移;如果high指针指向的元素小于基准元素21,那么将high指针指向的元素放到low指针指向的空位处。显然,当前high指向的1小于21,所以把1放到low指向的位置,此时high指向为空。
快速排序算法,数据结构与算法,排序算法,算法,数据结构
high指针指向空,操作low指针,对low指针:如果low指针指向元素小于基准元素21,那么low指针右移;如果low指针指向元素大于基准元素21,那么把low指针指向的元素放到high指向的空位处。
快速排序算法,数据结构与算法,排序算法,算法,数据结构
此时,100大于21,元素放到high,在代码中实际上就是交换low和high指向的元素值。
快速排序算法,数据结构与算法,排序算法,算法,数据结构
快速排序算法,数据结构与算法,排序算法,算法,数据结构
此时,low指向空,操作high,100大于21,high指针左移。
快速排序算法,数据结构与算法,排序算法,算法,数据结构
high指针指向50,依然大于21,high指针继续左移。
快速排序算法,数据结构与算法,排序算法,算法,数据结构
当high指向3的时候,3小于21,应交换元素。
快速排序算法,数据结构与算法,排序算法,算法,数据结构
此时,high指针指向空,操作low指针,low指向3,小于基准元素21,low指针右移。右移后我们发现,low指针和high指针指向同一个位置,此时将基准元素插入。
快速排序算法,数据结构与算法,排序算法,算法,数据结构
最后得到的序列,21左侧全部是小于21的元素,21右侧全部是大于21的元素。并且在本例中,划分好左右序列后,整个序列直接有序了。
快速排序算法,数据结构与算法,排序算法,算法,数据结构

算法实现(C语言)
void qSortArray(int array[], int start, int last)
{
	int low = start;
	int high = last;
	if (low < high)
	{
		while (low < high)
		{
			while (array[low] <= array[start] && low < last)
			{
				low++;//满足小于基准的条件,指针右移
			}
			while (array[high] >= array[start] && high > start)
			{
				high--;//满足大于基准的条件,指针左移
			}
			if (low < high)
			{
				swap(array[low], array[high]);//交换两个不满足条件的元素
			}
			else
			{
				break;
			}
		}
		swap(array[start], array[high]);//插入基准元素
		qSortArray(array, start, high - 1);
		qSortArray(array, high + 1, last);
	}
}
性能分析

稳定性
由于在快速排序中,元素的比较和交换是跳跃进行的,所以快速排序是一种不稳定的排序算法。比如下图所示,在划分时就改变了序列中两个1原本的顺序,本来在后面的1跑到了前面。
快速排序算法,数据结构与算法,排序算法,算法,数据结构
复杂度分析
快速排序的平均时间复杂度是O(nlogn),但是在实际排序中,时间复杂度和基准元素(枢轴)的选择有关。如果枢轴选取不好,那么快速排序有可能就会退化为冒泡排序,时间复杂度为O(n*n)。
由于快速排序是通过递归实现的,而递归又要依靠栈空间来实现,所以快速排序相对于其它排序更耗费空间资源。
通常来说,为了避免快速排序退化为冒泡排序,以及递归栈过深的问题,我们一般依据“三者取中”的法则来选取基准元素,“三者”即序列首元素、序列尾元素、序列中间元素,在三者中取中值作为本趟快速排序的基准元素。


快速排序算法,数据结构与算法,排序算法,算法,数据结构
快速排序算法,数据结构与算法,排序算法,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-794249.html


到了这里,关于图解快排——快速排序算法(quick sort)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 01_04_快速排序(Quick Sort)

    快速排序(Quick Sort)介绍: 是一种常用的排序算法,它采用分治的策略来对待排序的序列进行排序。快速排序的基本思想是选择一个基准元素,通过一趟排序将序列分割成两个子序列,其中一个子序列的所有元素都小于基准元素,另一个子序列的所有元素都大于基准元素。

    2024年02月10日
    浏览(23)
  • 【数据结构与算法篇】手撕八大排序算法之快排的非递归实现及递归版本优化(三路划分)

    ​👻内容专栏: 《数据结构与算法篇》 🐨本文概括: 利用数据结构栈(Stack)来模拟递归,实现快排的非递归版本;递归版本测试OJ题时,有大量重复元素样例不能通过,导致性能下降,优化快速排序通过将数组划分为三个区域,可以更有效地处理重复元素。 🐼本文作者:

    2024年02月11日
    浏览(50)
  • 八大排序算法之快速排序(下篇)(快排的优化+非递归快排的实现)

    目录 一.前言 1.快速排序的实现: 快速排序的单趟排序(排升序)(快慢指针法实现):​ 2.未经优化的快排的缺陷 二.快速排序的优化 1.三数取中优化 优化思路: 2. 小区间插入排序优化 小区间插排优化的递归快排: 三.非递归快速排序的实现 1.快排一个难以避免的缺陷(暂不考虑三指针

    2024年02月02日
    浏览(37)
  • 八大排序算法之快速排序(上篇)(未经优化的快排)

    目录 一.关于快速排序的总体算法思想 1.冒泡排序(交换排序) (以排升序为例) 2.快速排序的总体思想简介(以排升序为例)  二.快速排序单趟排序的算法接口设计(以排升序为例) 单趟排序实现的方法一:hoare版本(左右指针法) 代码实现:  单趟排序实现的方法二:挖坑法  代码实现

    2023年04月08日
    浏览(29)
  • 【基础算法】八大排序算法:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排),归并排序,计数排序

      🧑‍🎓 个人主页:简 料   🏆 所属专栏:C++   🏆 个人社区:越努力越幸运社区   🏆 简       介: 简料简料,简单有料~在校大学生一枚,专注C/C++/GO的干货分享,立志成为您的好帮手 ~ C/C++学习路线 (点击解锁) ❤️ C语言阶段(已结束) ❤️ 数据结构与算法(ing) ❤

    2024年02月01日
    浏览(34)
  • 【数据结构】排序之交换排序(冒泡 | 快排)

    在之前的博客中介绍了插入排序,有需要的可以点这个链接: link,这次来介绍交换排序,包括冒泡和快排。 话不多说,正文开始。 基本思想 :所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。 交换排序的特点是:将键值较大的记录向序

    2024年02月03日
    浏览(26)
  • 【排序算法】 快速排序(快排)!超详细看这一篇就够了”保姆级教学“

    🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 什么是快排?快排的速度到底有多快呢?它们的思想和实现是什么样的? 本文会对这快速排序进行详解,绝对细致入微!让你彻底搞懂快排! 英国计算机科学家Tony Hoare在1960年为了解决计算

    2024年02月05日
    浏览(44)
  • 【算法与数据结构】归并排序的代码实现(详细图解)以及master公式的讲解

    目录 1、归并排序  1.1、算法描述  1.2、图解说明 2、代码实现  3、master公式 3.1、公式以及结论 3.2、适用于某些特殊的递归 3.3、计算归并排序的时间复杂度 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用 递归 或者说是 分治法 (Divide and Conquer)的一个非

    2024年02月08日
    浏览(46)
  • 数据结构——排序算法之快速排序

        个人主页: 日刷百题 系列专栏 : 〖C/C++小游戏〗 〖Linux〗 〖数据结构〗   〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ ​ 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。 基本思想: 任取待排序元素序列中 的某元素作为基准值,按照

    2024年01月21日
    浏览(39)
  • 【数据结构与算法】十大经典排序算法-快速排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 快速排序(Quick Sort)是一种高效的排序算法,是对冒泡排序的优化。它采用分治法(Divide and Conquer)的思想,将待排序序列

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包