快速排序(优化版)

快速排序及优化方案 文章目录快速排序及其优化方案1. 快速排序的流程2. 快速排序的实现时间复杂度计算3. 快速排序优化随机获取基准值进行优化3.2二路快速排序原理:思想:4. 总结 快速排序及其优化方案 1. 快速排序的流程 首先设定一个分界值,通过该分界值将数组分成左右两部分。 将大于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边,而等于分分界值的部分放在相对中间的部分。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于分界值,相对中间的部分的的数据等于分界值。 然后,左边和右边的数据可以独立排序 阅读详情
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

void swap(int& big, int& small)
{
	int temp = big;
	big = small;
	small = temp;
}

int partition(int data[],int left,int right) 
{
	int base=data[right];  //以最后一个元素,data[right]为参照物
	int i=left-1;
	/*
	|这里运用的是观察者模式,i是一个旁观者
	|
	|游标j从左至右迭代,当if语句只判断data[j]<base情况
	|也就是说data[j]>base时的时候只是执行外层for循环,并移动游标j
	|
	|若序列开始部分的若干数据小于base时,就不执行i和j的值swap()交换。
	|
	|当arr[j]>base时,执行外层for循环。此时区间[0 : i]的取值都是小于base的
	|且区间[i:j]的值都是大于base的。记着 @_1
	|
	|当再次出现arr[j]<base时。i += 1 ,由上述@_1得知此时的arr[i]>arr[j],执行交换
	|继续for循环
	|
	|当j == right时,for 循环结束。此时我们知道:区间[0 : i]的取值
	|都是要小于区间[i : j]的取值的。记着 @_2
	|
	|现在由于j迭代到right时已经退出循环,此时没有进行arr[j]和base的比较
	|也就是没有进行base和arr[i]的比较。
	|但我们知道区间[i+1 : j-1]的取值都是大于base的  记着@_3
	*/

	 for(int j = left; j < right; j++)   
	 {
			  if( data[j] <= base)       
			  {
					i += 1; 	
					if (data[i] != data[j]) //毕竟比较两个数的大小要比复制数据在效率上更高
						swap(data[i],data[j]); //显然,不论怎样,小数值总是要放在左边的
			  }
	 }
	 /*
	 |由@_3得知,区间[i+1 : j-1]都是大于base的
	 |这里执行一次优化,既然arr[i+1]>base
	 |那么就交换arr[i+1]和base的取值。
	 |此时的序列中,区间[0 : i]都是小于区间[i : j]的
	 |但以i为分隔的前后序列都还不是有序的,所以传回分解符的位置到quicksort
	 |继续递归迭代。
	 */
	 swap(data[i+1],data[right]);   
	 return i+1;
}

void quickSort(int data[], int left, int right)
{
    if (left < right)
    {
        int index = partition(data, left, right);
        quickSort(data, left, index - 1);
        quickSort(data, index + 1, right);
    }
}
void main()
{
	
	srand(unsigned int(time(NULL)));
	const int size = 100;
	const int size_seed = 100;
	int iarray[size];

	for ( int i = 0; i <= size; i++ )
		iarray[i] = (rand()%size_seed+ 1);

//	clock_t begin = clock();
	quickSort(iarray, 0, size);
//	clock_t end = clock();

//	double result = difftime(end, begin);

	for (int j =0; j <= size; j++ )
		cout << iarray[j] << " ";
	/*清空内存缓冲区的数据,因为此时数据已经写入到显存中*/
//	cout<<"quick sort cost " << result/CLOCKS_PER_SEC << "seconds" << endl;
	cout.flush();

	cin.get();
}

8种对快速排序等算法的优化_快速排序优化 🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。 阅读详情

相关推荐

快速排序的三个优化思路

前言 本文主要是介绍关于快速排序的三种优化思路,所以是基于读者已经掌握快速排序算法思想以及最基本的实现的前提,遂有关于快速排序原理方面,这里就不多赘述了。 下面是快速排序最简单的实现版本,即每次选取待排序序列中最左侧的元素作为枢纽元。 package SortPractice; import java.util.Random; public class QuickSortTest { /...

To be a great coder 2114

Java面试之快速排序

快速排序 算法步骤 从数列中挑出一个元素,称为 “基准”(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序; 代码示例 public ...

We_chuan的博客 505

快速排序的六种实现,单轴快排,双轴快排JAVA实现

http://blog.youkuaiyun.com/Holmofy/article/details/71168530 这篇文章的实现代码

快速排序法及其优化

快速排序

tunmang5421的博客 1394

别再只盯着时序了!聊聊SDC里那些容易被忽略的‘配角’命令:工作条件、线载模型与面积约束

本文深入探讨了SDC(设计约束)中常被忽视的关键命令,包括set_operating_conditions、set_wire_load_model和set_max_area。这些‘配角’命令在芯片设计中扮演着至关重要的角色,影响时序收敛、功耗和面积优化。文章通过实际案例和最佳实践,揭示了如何正确配置工作条件、选择线载模型以及动态调整面积约束,以提升设计质量和效率。

weixin_26875109的博客 208

倍福PLC--PERSISTENT断电保持数据和BOOT中各文件对应的解析

将D:\TC3程序\TwinCAT Project146\TwinCAT RT(x86)\Plc 文件夹的中三个替换文件复制到:G:\TwinCAT\3.1\Boot\Plc完成替换,如下图。(2) 找到程序所存的路径,编程电脑的D:\TC3程序\TwinCAT Project146路径下,并选择对应系统平台TwinCAT RT(x86)(3) 控制器断电,拔出内存卡,使用读卡器,在编程电脑中打开:(本次测试读卡器为G盘)(5) 开机完成后,TwinCAT自动运行,当前闪灯频率为50ms。

weixin_41883890的博客 2344

快速排序的4种优化

快排思想 快排基准的选择 固定基准 随机基准 三数取中 快速排序的优化 优化1:序列长度达到一定大小时,使用插入排序 优化2:尾递归优化 优化3:聚集元素 优化4:多线程处理快排 快排思想 快排算法是基于分治策略的排序算法,其基本思想是,对于输入的数组a[low, high],按以下三个步骤进行排序。 (1)分解:以a[...

Tyler_Zx的博客 5万+

C#构建高精度预测模型:从数据预处理到模型部署的实战指南

【代码】C#构建高精度预测模型:从数据预处理到模型部署的实战指南。

墨夶的博客 1263

优化版QuickSort 快速排序

尝试中位数+插入排序QuickSort

BruceLay的博客 174

【电路设计】SERDES与pcie

明确通信接口需要达到什么样的数据速率、信号完整性以及系统中各个部件的互相作用。2.

数字人生 4566

拉曼光谱入门:7.拉曼光谱仪光学系统结构详解

本文系统拆解了拉曼光谱仪从激光器输出经聚焦照明、二向色镜/陷波滤光片组滤除瑞丽散射、衍射光栅色散至CCD探测的完整光路,阐述了各光学模块在微弱非弹性散射信号提取、杂散光抑制及高分辨光谱成像中的工程原理与技术参数要求。

qq_53529450的博客 223

三种快速排序以及快速排序的优化

1、快速排序的基本思想:    快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 2、快速排序的三个步骤: (1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot) (2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在

思考,思考,再思考~ 5万+

lammps多晶正弦粗糙界面建模

其中,30可以理解为正弦曲线的幅度,150为正弦曲线的基准坐标值,80控制周期,改变参数多试试就能找到规律。很久之前介绍过lammps粗糙界面建模,主要是在lammps中进行一维和二维的正弦粗糙面建模。运行完成后,会生成final.data,这个模型即为上表面为正弦波动的粗糙界面。新建1.py文件,粘贴下面内容后,运行:python 1.py。多晶需要在atomsk中进行,因此上述的方法就不再适用。最近有学员咨询多晶模型的正弦粗糙界面建模应该如何实现。在cmd窗口按顺序运行以下命令创建多晶模型。

lammps_jiayou的博客 387

快速排序的5种优化方法

三种快速排序以及快速排序的优化 1、快速排序的基本思想:    快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,递归地以达到整个序列有序的目的。 2、快速排序的三个步骤: (1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot) (2)分割操作:以该基准在序列中...

qq_19525389的博客 3万+

2、探索谷歌云平台(GCP):入门指南

本文全面介绍了谷歌云平台(GCP)的入门知识,涵盖其全球基础设施、核心服务和使用方法。内容包括GCP区域与可用区结构、创建免费账户、配置计算资源(如GCE虚拟机)、存储类型(PD、Filestore、GCS)、网络架构(VPC)、组织与项目管理、身份访问控制(IAM),以及计算、存储、数据库、大数据和人工智能等各类云服务。文章还提供了资源规划、安全管理和成本控制等实用建议,帮助用户快速上手并高效利用GCP构建可扩展的云解决方案。

uber9的博客 255

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

开发Flink Gauss CDC是为了适配华为自研GaussDB的特殊日志格式和逻辑复制机制,解决Flink CDC无法直接支持的问题,同时优化存量与增量同步的效率和一体化读取能力,满足GaussDB复合主键处理、数据落库等定制化需求,以实现高效、准确的数据同步。

数据与算法架构提升之路专栏 1985

C语言实现快速排序及快速排序的优化和分析

C语言实现快速排序及快速排序的优化,超详细讲解看完包会

weixin_62244902的博客 1907

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

快速排序优化版

快速排序优化版 package com.mtons.mblog.leetcode; /** * 快速排序优化版 */ final class DualPivotQuicksort { /** * Prevents instantiation. */ private DualPivotQuicksort() {} /* * Tunin...

开心就好 6181

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

快速排序的优化

1.前言 前面的一篇文章https://www.cnblogs.com/backnullptr/p/11934841.html讲了快速排序的基本概念、核心思想、基础版本代码实现等,让我们对快速排序有了一个充分的认识,但还无法达到面试中对快速排序灵活应对的程度。 快速排序是图领奖得主发明的算法,被誉为20世纪最重要的十大算法之一,快速排序为了可以在多种数据集都有出色的表现,进行了非常多的优化,因...

owenzhang的博客 1107

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

快速排序及其优化

3.快速排序及其优化 **并没有最好的排序算法,只有最适合的排序算法。**在面对不同规模的数据和不同排列的数据的时候,都有着适合当前数据的排序算法,一个好的排序算法就是面对合适的场景去选取最适合它的排序算法。 3.1 普通快速排序 **快排的思想找到一个值使得数组左边的值都是小于等于它的数,数组的右边都是大于它的数。**然后继续去操作左右区间。可以看到,分成左右区间后,分别对不同的区间继续当前操作,非常适合递归。 如上图所示,需要两个指针。 j 数组遍历的位置,i 第一个大于等于 选取的基准值的位置。 遍

weixin_39034379的博客 3246

快速排序及优化方法

先设置好大框架,while(x<y),这里选择序列最左边的元素为基准值,所以先从序列的右边和这个基准值进行比较(我们将这个序列按从小到大的顺序输出), 如果右边arr[y]比基准值小,我们就将y--,然后继续与基准值比较,直到找到小于它的元素,然后跳出循环,进入if判断语句,向这里if后面的语句分为两步理解,先赋值,后++,arr[x]=arr[y],x++;具体类似无监督插入排序,简单的理解就是优化判断条件,减少判断条件次数 ,优化分区代码执行过程中的判断条件,减少判断次数,进而减少算法的运行时间。

lsy1118的博客 648

快速排序的优化思路

在对快速排序进行优化前,先让我们回顾一些快速排序的思想: 快速排序就是分而治之思想的体现,将有序序列分成对立的两部分,一部分值都比关键字值小,一部分值都比关键字值大,再分别对两部分进行排序 对快速排序不了解的可以先看看快速排序的具体过程和代码讲解 下面来看代码: #include<iostream> #include<algorithm> using namespace std; //该函数作用:把比关键字小的放到关键字的左边,比关键字大的放到关键字右边 int partition(

m0_53157173的博客 1186

数据结构第20节 快速排序以及优化

快速排序是一种非常高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年代发明。它使用分治法(Divide and Conquer)策略来把一个序列分为较小的部分,然后递归地排序这些部分。

hummhumm的专栏 1538
上一篇: 二元搜索
下一篇: 创建最大堆
错_对
博客等级 码龄16年 68粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值