#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();
}相关推荐
快速排序的三个优化思路
前言 本文主要是介绍关于快速排序的三种优化思路,所以是基于读者已经掌握快速排序算法思想以及最基本的实现的前提,遂有关于快速排序原理方面,这里就不多赘述了。 下面是快速排序最简单的实现版本,即每次选取待排序序列中最左侧的元素作为枢纽元。 package SortPractice; import java.util.Random; public class QuickSortTest { /...
Java面试之快速排序
快速排序 算法步骤 从数列中挑出一个元素,称为 “基准”(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序; 代码示例 public ...
快速排序的六种实现,单轴快排,双轴快排JAVA实现
http://blog.youkuaiyun.com/Holmofy/article/details/71168530 这篇文章的实现代码
快速排序法及其优化
快速排序
别再只盯着时序了!聊聊SDC里那些容易被忽略的‘配角’命令:工作条件、线载模型与面积约束
本文深入探讨了SDC(设计约束)中常被忽视的关键命令,包括set_operating_conditions、set_wire_load_model和set_max_area。这些‘配角’命令在芯片设计中扮演着至关重要的角色,影响时序收敛、功耗和面积优化。文章通过实际案例和最佳实践,揭示了如何正确配置工作条件、选择线载模型以及动态调整面积约束,以提升设计质量和效率。
倍福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。
快速排序的4种优化
快排思想 快排基准的选择 固定基准 随机基准 三数取中 快速排序的优化 优化1:序列长度达到一定大小时,使用插入排序 优化2:尾递归优化 优化3:聚集元素 优化4:多线程处理快排 快排思想 快排算法是基于分治策略的排序算法,其基本思想是,对于输入的数组a[low, high],按以下三个步骤进行排序。 (1)分解:以a[...
C#构建高精度预测模型:从数据预处理到模型部署的实战指南
【代码】C#构建高精度预测模型:从数据预处理到模型部署的实战指南。
优化版QuickSort 快速排序
尝试中位数+插入排序QuickSort
【电路设计】SERDES与pcie
明确通信接口需要达到什么样的数据速率、信号完整性以及系统中各个部件的互相作用。2.
拉曼光谱入门:7.拉曼光谱仪光学系统结构详解
本文系统拆解了拉曼光谱仪从激光器输出经聚焦照明、二向色镜/陷波滤光片组滤除瑞丽散射、衍射光栅色散至CCD探测的完整光路,阐述了各光学模块在微弱非弹性散射信号提取、杂散光抑制及高分辨光谱成像中的工程原理与技术参数要求。
三种快速排序以及快速排序的优化
1、快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 2、快速排序的三个步骤: (1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot) (2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在
lammps多晶正弦粗糙界面建模
其中,30可以理解为正弦曲线的幅度,150为正弦曲线的基准坐标值,80控制周期,改变参数多试试就能找到规律。很久之前介绍过lammps粗糙界面建模,主要是在lammps中进行一维和二维的正弦粗糙面建模。运行完成后,会生成final.data,这个模型即为上表面为正弦波动的粗糙界面。新建1.py文件,粘贴下面内容后,运行:python 1.py。多晶需要在atomsk中进行,因此上述的方法就不再适用。最近有学员咨询多晶模型的正弦粗糙界面建模应该如何实现。在cmd窗口按顺序运行以下命令创建多晶模型。
快速排序的5种优化方法
三种快速排序以及快速排序的优化 1、快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,递归地以达到整个序列有序的目的。 2、快速排序的三个步骤: (1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot) (2)分割操作:以该基准在序列中...
2、探索谷歌云平台(GCP):入门指南
本文全面介绍了谷歌云平台(GCP)的入门知识,涵盖其全球基础设施、核心服务和使用方法。内容包括GCP区域与可用区结构、创建免费账户、配置计算资源(如GCE虚拟机)、存储类型(PD、Filestore、GCS)、网络架构(VPC)、组织与项目管理、身份访问控制(IAM),以及计算、存储、数据库、大数据和人工智能等各类云服务。文章还提供了资源规划、安全管理和成本控制等实用建议,帮助用户快速上手并高效利用GCP构建可扩展的云解决方案。
Flink Gauss CDC:深度剖析存量与增量同步的创新设计
开发Flink Gauss CDC是为了适配华为自研GaussDB的特殊日志格式和逻辑复制机制,解决Flink CDC无法直接支持的问题,同时优化存量与增量同步的效率和一体化读取能力,满足GaussDB复合主键处理、数据落库等定制化需求,以实现高效、准确的数据同步。
C语言实现快速排序及快速排序的优化和分析
C语言实现快速排序及快速排序的优化,超详细讲解看完包会
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
快速排序优化版
快速排序优化版 package com.mtons.mblog.leetcode; /** * 快速排序优化版 */ final class DualPivotQuicksort { /** * Prevents instantiation. */ private DualPivotQuicksort() {} /* * Tunin...
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
快速排序的优化
1.前言 前面的一篇文章https://www.cnblogs.com/backnullptr/p/11934841.html讲了快速排序的基本概念、核心思想、基础版本代码实现等,让我们对快速排序有了一个充分的认识,但还无法达到面试中对快速排序灵活应对的程度。 快速排序是图领奖得主发明的算法,被誉为20世纪最重要的十大算法之一,快速排序为了可以在多种数据集都有出色的表现,进行了非常多的优化,因...
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
快速排序及其优化
3.快速排序及其优化 **并没有最好的排序算法,只有最适合的排序算法。**在面对不同规模的数据和不同排列的数据的时候,都有着适合当前数据的排序算法,一个好的排序算法就是面对合适的场景去选取最适合它的排序算法。 3.1 普通快速排序 **快排的思想找到一个值使得数组左边的值都是小于等于它的数,数组的右边都是大于它的数。**然后继续去操作左右区间。可以看到,分成左右区间后,分别对不同的区间继续当前操作,非常适合递归。 如上图所示,需要两个指针。 j 数组遍历的位置,i 第一个大于等于 选取的基准值的位置。 遍
快速排序及优化方法
先设置好大框架,while(x<y),这里选择序列最左边的元素为基准值,所以先从序列的右边和这个基准值进行比较(我们将这个序列按从小到大的顺序输出), 如果右边arr[y]比基准值小,我们就将y--,然后继续与基准值比较,直到找到小于它的元素,然后跳出循环,进入if判断语句,向这里if后面的语句分为两步理解,先赋值,后++,arr[x]=arr[y],x++;具体类似无监督插入排序,简单的理解就是优化判断条件,减少判断条件次数 ,优化分区代码执行过程中的判断条件,减少判断次数,进而减少算法的运行时间。
快速排序的优化思路
在对快速排序进行优化前,先让我们回顾一些快速排序的思想: 快速排序就是分而治之思想的体现,将有序序列分成对立的两部分,一部分值都比关键字值小,一部分值都比关键字值大,再分别对两部分进行排序 对快速排序不了解的可以先看看快速排序的具体过程和代码讲解 下面来看代码: #include<iostream> #include<algorithm> using namespace std; //该函数作用:把比关键字小的放到关键字的左边,比关键字大的放到关键字右边 int partition(
数据结构第20节 快速排序以及优化
快速排序是一种非常高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年代发明。它使用分治法(Divide and Conquer)策略来把一个序列分为较小的部分,然后递归地排序这些部分。
2114



被折叠的 条评论
为什么被折叠?



