快排算法(分治法)

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

一:什么是快排

        相信很多人接触到的第一个排序就是冒泡排序,冒泡排序是一种拿一个数依次和后面进行比较,这样也就确保了每一次排序之后不论降序还是升序这一个数都会在末尾或者最前端,那么今天我们要将的是快速排序,基于冒泡排序的改进版本,为什么说是改进呢。要说冒泡排序是一个数都所有的数进行比较,那么快排就是将一组数分成大小两堆,然后在按照这种方法去分,知道保证只剩下一个数,这样也就保证了它是有序的了,接下里我们一起看一下他的实现原理及过程。

二:实现过程

        快排又称为挖坑排序发,具体是什么意思呢。首先我们给定一个数组,这个数可以是数组中任意选定的一个数,假定我们选择的这个数就是第一个数我们设他为privot,然后在给定一个左下标和右下标(设为left为小堆和right为大堆),再用两个变量来保存当前left和right的值(设为L&&R),然后left和right依次往中间移动,

快速排序(分治法),算法,排序算法,数据结构

        设我们先移动right指向的数,如果遇到的数>=privot我们就不用管他,直到遇到了小于privot的数我们就停止对right的移动。

快速排序(分治法),算法,排序算法,数据结构

         当right找到了比privot小的数我们就停止对他的移动,然后移动我们的left,同理,如果left遇到的数小于privot我们就不用管,直到遇到大于privot的数就停止。这个时候我们就找了第一次需要交换位置的两个元素,我们可以用空瓶子的原理交换也可以运用加法或者异或,交换的方法有很多这里就不一一列举了。

快速排序(分治法),算法,排序算法,数据结构

当我们交换了这个元素的位置之后就得到一个这样一个数组了

快速排序(分治法),算法,排序算法,数据结构

         然后我们就可以重复这样的步骤,最后一直到left和right都指向同一个元素的时候也就是没有元素在可以进行比较交换了,我们这个时候就可以把我们的privot这个数放在这个位置

快速排序(分治法),算法,排序算法,数据结构

交换之后的数组就变成了左边全是小于privot的数,右边全是大于privot的数

快速排序(分治法),算法,排序算法,数据结构

如果我们认真看就会发现循环一次之后的privot刚好是在本来应该存在的位置 。这样我们就完成了第一个数的排序。

小堆的排序:这个时候我们就可以把从privot的数分开作为小,大堆。设我们接下来需要对小堆进行排序,对小堆进行排序的话也就是当前的右下标指向的值不能超过privot,我们就可以让右下表指向right-1的位置,然后再把L和right-1再传给这个函数它继续对剩下的值进行排序,当最后只有一个数的时候我们认为它就是有序的。

大堆的排序:同理大堆就是全部都是大于privot的数,我们就可以让left+1设为开始的坐下标,又下标为R,然后当只剩最后一个数的时候同样它也是有序的。

三:总结

1:从数组中任意找出一个数作为基数,设置左右下标依次移动,当right遇到的数小于privot就停止移动,left遇到大于privot的数也停止移动,然后交换这两个数。

2:当左右下标都指向同一个值的时候就把privot和这个数交换

3:重复上面的步骤文章来源地址https://www.toymoban.com/news/detail-597976.html

void quicksort(int arr[], int left, int right)		//快排
{
	//保存当前left,right位置
	int	L = left;		
	int R = right;
	//用第一个元素作为基点
	int privot = arr[L];
	while (L < R)
	{
		while (L < R && arr[R] >= privot)
		{
			R--;						//5,6,8,1,4,3,9,2,7,10
		}
		while (L < R && arr[L] <= privot)
		{
			L++;

		}
		//如果L指向的元素大于R指向的元素就交换他们的值
		if (arr[L] > arr[R])
		{
			int tmp = arr[L];
			arr[L] = arr[R];
			arr[R] = tmp;
		}
	}
	//将L指向的值非起始位置
	arr[left] = arr[L];
	//在将privot的值放在L的位置
	arr[L] = privot;
	//以L为起点的地方到L-1的地方分为小堆
	quicksort(arr, left, L-1);
	//以L+1的地方到right分为大堆
	quicksort(arr, L+1, right);
}
int main()
{
	int arr[10] = { 5,6,8,1,4,3,9,2,7,10 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0])-1;
	quicksort(arr, left, right);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d", arr[i]);
	}
}

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

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

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

相关文章

  • 【数据结构与算法】:选择排序与快速排序

    🔥 个人主页 : Quitecoder 🔥 专栏 :数据结构与算法 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:腾讯云 欢迎来到排序的第二个部分:选择排序与快速排序! 选择排序是一种简单直观的比较排序算法。该算法的基本思想是在每一轮中选出当前未排序部分的最

    2024年03月17日
    浏览(40)
  • 数据结构与算法之快速排序

    快速排序 (Quick Sort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数

    2024年02月10日
    浏览(33)
  • 【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.冒泡排序 2.快速排序 2.1Hoare版 2.2占坑版 2.3前后指针版 2.4三数取中对快速排序的优化 2.5非递归版 3.归

    2024年02月08日
    浏览(35)
  • 【数据结构与算法】:非递归实现快速排序、归并排序

    🔥 个人主页 : Quitecoder 🔥 专栏 :数据结构与算法 上篇文章我们详细讲解了递归版本的快速排序,本篇我们来探究非递归实现快速排序和归并排序 快速排序的非递归实现主要依赖于栈(stack)来模拟递归过程中的函数调用栈。递归版本的快速排序通过递归调用自身来处理子

    2024年03月24日
    浏览(44)
  • 【数据结构】带你玩转排序:堆排序、希尔排序、插入排序、选择排序、冒泡排序、快排(多版本)、归并排序

    英杰社区 https://bbs.csdn.net/topics/617804998 目录 常见算法的实现         插入排序         希尔排序         堆排序         选择排序         冒泡排序         快速排序         Hoare版本         随机选Keyi               三数取中         挖坑法  

    2024年02月08日
    浏览(41)
  • 【数据结构与算法】如何对快速排序进行细节优化以及实现非递归版本的快速排序?

    君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,国庆长假结束了,无论是工作还是学习都该回到正轨上来了,从今天开始恢复正常的更新频率,今天为大家带来的内容是快速排序的两大优化和非递归实现 好了废话不多说,开

    2024年02月08日
    浏览(37)
  • 算法:分治思想处理快排递归以及快速选择/最小K个数问题

    分治的原理就是分而治之,从原理上讲,就是把一个复杂的问题划分成子问题,再将子问题继续划分,直到可以解决 基于分治的原理进行快速排序,区别于传统的快速排序,这里对快速排序进行改良,成为更优先的三路划分算法,可以处理一些极端场景,使快速排序的适用性

    2024年02月10日
    浏览(39)
  • 【数据结构与算法】快速排序的非递归实现方法

      目录 一.前言 二.非递归实现 如果数据量过大的话,不断递归就会出现 栈溢出 的现象,这个时候你的代码是没问题的,但就是跑不起来,这个时候就要 把递归改成非递归 。 一般有两种改法: 1.直接改,利用循环等; 2.借助栈的辅助。 而快速排序的非递归实现方法就需要

    2023年04月17日
    浏览(40)
  • 【数据结构与算法】快速排序的三种实现方法

      目录 一.基本思想 二.Hoare法 动态演示 三.挖坑法 动态演示 四.前后指针法 动态演示 五.快速排序优化 随机下标交换法 三路取中法 六.快速排序的特性 任取待排序元素序列中的某元素作为 基准值 ,按照该排序码将待排序集合 分割成两子序列 , 左子序列中所有元素均小于基

    2023年04月09日
    浏览(46)
  • 【数据结构】详解七大排序算法(直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序)

    1、基本思想    把待排序的数按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所以的记录插入完为止,得到一个新的有序序列。    实际中我们玩扑克牌时,就用到了插入排序的思想 基本步骤:    当插入第i个元素时,前面的arr[0]、arr[2]…arr

    2024年02月04日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包