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

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

目录

一、前言

(1)分治算法

(2)分治算法解题方法

    1.分解:

    2.治理:

    3.合并:

二、快速排序

1.问题分析

2.算法设计

    (1)分解:

    (2)治理 :

    (3)合并:

    (4)基准元素的选取:

3.算法分析

三、AC代码

 四、共勉


一、前言

(1)分治算法

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

(2)分治算法解题方法

    1.分解:

    将要解决的问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题。

    2.治理:

    求解各个子问题。由于各个子问题与原问题形式相同,只是规模较小而已,而当子问题划分得足够小时,就可以用简单的方法解决。

    3.合并:

    按原问题的要求,将子问题的解逐层合并构成原问题的解。

二、快速排序

1.问题分析

    快速排序是比较快的排序方法。它的基本思想是通过一组排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按此方法对这两部分数据进行快速排序,整个排序过程可以递归进行,以此使所有数据变成有序序列。

2.算法设计

    (1)分解:

    先从数列中取出一个元素作为基准元素。一基准元素为标准,将问题分解为两个子序列,使小于或者等于基准元素的子序列在左侧,使大于基准元素的子序列在右侧。

    (2)治理 :

    对两个子序列进行快速排序(递归快速排序)。

    (3)合并:

    将排好的两个子序列合并在一起,得到原问题的解。

    (4)基准元素的选取:

    ①:取第一个元素。(通常选取第一个元素)

    ②:取最后一个元素

    ③:取中间位置的元素

    ④:取第一个、最后一个、中间位置元素三者之中位数

    ⑤:取第一个和最后一个之间位置的随机数 k (low<=k<=hight)

3.算法分析

    假设当前的待排序的序列为 R[low,hight] , 其中 low<=hight。同时选取首元素为基准元素。

步骤一:选取首元素的第一个元素作为基准元素  pivot=R[low] ,i=low ,j=hight。

步骤二:从右向左扫描,找到小于等于 pivot 的数,如果找到,R[i] 和 R[j] 交换 ,i++。

步骤三:从左向右扫描,找到大于 pivot 的数,如果找到,R[i] 和 R[j] 交换,j--。

步骤四:重复 步骤二~步骤三,直到  j 与 i 的指针重合 返回位置 mid=i ,该位置的数正好是 pivot 元素。

    至此换成一趟排序,此时以 mid 为界线,将数据分割为两个子序列,左侧子序列都比 pivot 数小,右侧子序列都比 pivot 数大,然后再分别对这两个子序列进行快速排序。  

    下面我将以序列(30,24,5,58,18,36,12,42,39)为例,进行图解。

(1)初始化。i=low ,j=hight,pivot=R[low]=30。如下图所示:

c++快速排序,排序,分治算法,c++,算法,排序算法

 (2)向左走,从数组的右边位置向左找,一直找到小于等于 pivot 的数,找到R[j]=12,R[i]与R[j]交换,i++。如下图所示:

c++快速排序,排序,分治算法,c++,算法,排序算法

 c++快速排序,排序,分治算法,c++,算法,排序算法

(3)向右走,从数组的左边位置向右找,一直找到比 pivot 大的数,找到 R[i]=58 ,R[i] 与 R[j] 交换 ,j--。

c++快速排序,排序,分治算法,c++,算法,排序算法

c++快速排序,排序,分治算法,c++,算法,排序算法 (4)向左走,从数组的右边位置向左找,一直找到小于等于 pivot 的数,找到R[j]=18,R[i]与R[j]交换,i++。如下图所示:

 c++快速排序,排序,分治算法,c++,算法,排序算法

c++快速排序,排序,分治算法,c++,算法,排序算法 (5)向右走,从数组的左边位置向右找,一直找到比 pivot 大的数,这是 i=j,第一轮排序结束,返回 i 的位置,mid=i 。以上的操作是对序列进行分解,其代码如下图所示:

int part(int* r, int low, int hight)  //划分函数
{
	int i = low, j = hight, pivot = r[low]; //基准元素
	while (i < j)
	{
		while (i<j && r[j]>pivot) //从右向左开始找一个 小于等于 pivot的数值
		{
			j--;
		}
		if (i < j)
		{
			swap(r[i++], r[j]);  //r[i]和r[j]交换后 i 向右移动一位
		}
		while (i < j && r[i] <= pivot) //从左向右开始找一个 大于 pivot的数值
		{
			i++;
		}
		if (i < j)
		{
			swap(r[i], r[j--]);  //r[i]和r[j]交换后 i 向左移动一位
		}
	}
	return i;  //返回最终划分完成后基准元素所在的位置
}

(6)然后在分别对这两个序列(12,24,5,18)和(36,58,42,39)进行快速排序(递归)。其代码如下图所示:

void Quicksort(int* r, int low, int hight)
{
	int mid;
	if (low < hight)
	{
		mid = part(r, low, hight);  // 返回基准元素位置
		Quicksort(r, low, mid - 1); // 左区间递归快速排序
		Quicksort(r, mid+1, hight); // 右区间递归快速排序
	}
}

三、AC代码

#include <stdio.h>
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
int part(int* r, int low, int hight)  //划分函数
{
	int i = low, j = hight, pivot = r[low]; //基准元素
	while (i < j)
	{
		while (i<j && r[j]>pivot) //从右向左开始找一个 小于等于 pivot的数值
		{
			j--;
		}
		if (i < j)
		{
			swap(r[i++], r[j]);  //r[i]和r[j]交换后 i 向右移动一位
		}
		while (i < j && r[i] <= pivot) //从左向右开始找一个 大于 pivot的数值
		{
			i++;
		}
		if (i < j)
		{
			swap(r[i], r[j--]);  //r[i]和r[j]交换后 i 向左移动一位
		}
	}
	return i;  //返回最终划分完成后基准元素所在的位置
}
void Quicksort(int* r, int low, int hight)
{
	int mid;
	if (low < hight)
	{
		mid = part(r, low, hight);  // 返回基准元素位置
		Quicksort(r, low, mid - 1); // 左区间递归快速排序
		Quicksort(r, mid+1, hight); // 右区间递归快速排序
	}
}
int main()
{
	int a[10001];
	int  N;
	cout << "请输入要排序的数据的个数: " << endl;
	cin >> N;
	cout << "请输入要排序的数据: " << endl;
	for (int i = 0; i < N; i++)
	{
		cin >> a[i];
	}
	cout << endl;
	Quicksort(a, 0, N - 1);
	cout << "排序后的序列为: " << endl;
	for (int i = 0; i < N; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
	return 0;
}

c++快速排序,排序,分治算法,c++,算法,排序算法

 四、共勉

    以下就是我对分治:快速排序的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对分治算法的理解,请持续关注我哦!!!!!!!!

c++快速排序,排序,分治算法,c++,算法,排序算法

 文章来源地址https://www.toymoban.com/news/detail-778741.html

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

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

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

相关文章

  • 快速排序算法(C++版)

    快速排序(Quick Sort) 是一种常用的高效排序算法,属于分治法的典型代表。它的基本思想是选择一个基准元素,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有元素小于基准,另一部分的所有元素大于基准,然后对这两部分分别递归地进行排序。因为

    2024年02月05日
    浏览(70)
  • 进程调度算法——C++实现 [ FCFS,SJF,HPR,HRN + 开源代码 + 详细解析 ]

    ✅ (原创,库存,第100篇博客,纪念一下) (1) 先来先服务算法FCFS (First Come First Service):即调度程序只靠率一个参数———作业到达系统的时间,谁先到就先给谁提供服务。 (2) 最短作业优先算法SJF (Shortest Job First):即我们也只考虑一个参数———进程的CPU的执行时间,计算量

    2023年04月13日
    浏览(23)
  • 用Python实现快速排序和冒泡排序,代码+详细解析

    1、冒泡排序         冒泡排序:每一次相邻的两个数做比较,大的往后移动一位,每次循环都会把最大的值(升序)或最小的值(降序)放在末端 。 2、快速排序         快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地

    2024年02月11日
    浏览(34)
  • 【C++实现插入排序、希尔排序、冒泡排序、快速排序、选择排序】

    使用C++实现来插入排序、希尔排序、冒泡排序、快速排序、选择排序算法。 插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而生成一个新

    2024年02月06日
    浏览(36)
  • c++排序算法——冒泡排序(不会的一定要看,超级详细)

    今天,我们来学习一种排序算法—— 冒泡排序 。 首先,先问三个问题: 想象一下,如果字典不是按照字母顺序排列,查找一个单词,你得查到什么时候?这就是为什么人们引入了分类的概念,因为其 极大地帮助我们快速搜索物品 。 或者说,排序是一种常用的整理信息的方

    2024年02月16日
    浏览(32)
  • C++算法 —— 分治(2)归并

    本篇前提条件是已学会归并排序 912. 排序数组 排序数组也可以用归并排序来做。 剑指 Offer 51. 数组中的逆序对 如果暴力枚举,一定是可以解决问题的,但肯定不用这个解法。选择逆序对,可以先把数组分成两部分,左半部分 + 右半部分的逆序对,以及再找左半部分的数字和

    2024年02月10日
    浏览(31)
  • 【C++算法模板】图论-拓扑排序,超详细注释带例题

    推荐视频链接:D01 拓扑排序 给定一张 有向无环图 ,排出所有顶点的一个序列 A A A 满足:对于图中的每条有向边 ( x , y ) (x,y) ( x , y ) , x x x 在 A A A 中都出现在 y y y 之前,则称 A A A 是该图的顶点的一个拓扑序 拓扑排序 可以判断有向图中是否有环,可以生成拓扑序列 对于下

    2024年04月15日
    浏览(32)
  • 【C语言】解析C语言实现排序的算法(冒泡排序、插入排序、选择排序、快速排序、归并排序)

    本博客主要围绕五种常见的排序算法展开讨论,包括选择排序、快速排序、归并排序、冒泡排序和插入排序。针对每种算法,我对其思想、特点、时间复杂度、稳定性以及优缺点进行了详细解释和比较。 冒泡排序算法是一种简单且常用的排序算法。它通过重复地交换相邻的元

    2024年02月13日
    浏览(32)
  • C++:分治算法之输油管道问题

    目录 描述 输入 输出 输入样例 输出样例 分析 代码 运行结果 ¢ 某石油公司计划建造一条 由东向西 的主输油管道。该管道要穿过一个有 n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。 ¢ 如果给定 n 口油井的位置,即它们的 x 坐标(

    2024年02月02日
    浏览(31)
  • 【算法篇C++实现】常见排序算法

    算法精炼 每趟从待排序的记录中选出最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。 简单排序处理流程 从待排序序列中,找到最小的元素; 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换; 从余下的 N - 1 个元素中

    2024年02月13日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包