编程之法第二章【快速排序的两种方法】

手把手教你用DevExpress Patch工具解决VS项目中的试用弹窗问题 本文详细指导开发者使用DevExpress Patch工具解决Visual Studio项目中恼人的试用弹窗问题。核心在于理解并分步处理:首先正确应用补丁工具以绕过运行时验证,然后重点清理或重置项目中的licenses.licx文件以消除编译时验证,从而彻底根治弹窗。 阅读详情

花了两个多小时重新复习了快速排序,之前以为懂,但是真正实践的时候才发现自己错了。

快速排序有两种实现方式。都是两个指针,不过之前学的一种是一个从头开始扫,一个从尾开始扫。另外一种是两个都是从头开始扫,不过一个比另外一个前一个位置。

如果真正的理解快排的原理,对于一些排序的问题就会迎刃而解了。

例如奇偶分开,荷兰国旗(相当于对012排序)

虽说今天花的时间比较多,但是理解了就感觉受益颇多,主要是思想,但是自己的实现能力还是不行。还是要多锻炼。


这是《编程之法》上的一道题目,将奇偶数分开,不考虑原始顺序,我用两种快排实现,可能还不是很正确,但是思路应该是对的。


#include <iostream>
#include <algorithm>

using namespace std;

bool judge(int a) {
	return (a&1)==1;
}
//快排1 
void OddEvenSort2(int *a,int l,int r) {
	int x=a[r];
	int i=l-1,j=l;
	for(j=l; j<r; j++) {
		if(judge(a[j])) {
			i++;
			swap(a[i],a[j]);
		}
	}
	swap(a[r],a[i+1]);
	for(int i=0; i<=r; i++)
		cout<<a[i]<<" ";
	cout<<endl;
}
//快排2 
void test(int *a,int l,int r){
	int i=l,j=r,x=a[l];
	while(i<j){
		while(i<j&&!judge(a[j])) j--;
		if(i<j){
			a[i]=a[j];
			i++;
		} 
		while(i<j&&judge(a[i])) i++;
		if(i<j){
			a[j]=a[i];
			j--;
		}
	}
	a[i]=x;
	for(int i=0; i<=r; i++)
		cout<<a[i]<<" ";
	cout<<endl;
}
int main() {
	int a[10]= {-121,15,241,-23,-121,57,15161,19,781,111};
	test(a,0,9);
	OddEvenSort2(a,0,9);
}

这是荷兰国旗这道题,如果能够理解快排的一种方法,那么三种指针也容易理解了,难就难在分类讨论要准确而已。

三种情况:(F:头指针,C:当前指针,E:尾指针)

1.当C==0时,和F交换,C++,F++,因为0要放在前面。

2.当C==1时,不用换,C++

3.当C==2时,和E交换,E--,但是C不动,因为他有可能是0或者1,0的话还要和F交换,考虑一下(201012)应该就会明白了。


#include <iostream>
#include <algorithm>

using namespace std;

void flag(int *a,int len)
{
	int f=0,s=0,e=len-1;
	while(s<=e){
		if(a[s]==0){
			swap(a[s],a[f]);
			s++;f++;
		}
		else if(a[s]==1){
			s++;
		}
		else{
			swap(a[s],a[e]);
			e--;
		}
	}
	for(int i=0;i<len;i++)
	cout<<a[i]<<" ";
	cout<<endl;
}

int main(){
	int a[10]={2,0,1,2,0,2,0,1,1,0};
	flag(a,10);
}



大模型-internvl高通qnn运行源码解读 模型链接:https://huggingface.co/OpenGVLab/InternVL2-2B论文官方简要说明 https://internvl.github.io/blog/2024-07-02-InternVL-2.0中文解读 https://zhuanlan.zhihu.com/p/702946079在线demo https://internvl.opengvlab.com/ 阅读详情

相关推荐

华为海思IC笔试通关秘籍:物理/电路/工艺三大方向高频考点解析(附真题)

本文深度解析华为海思IC笔试中物理设计、电路设计和工艺制造三大方向的高频考点与备考策略。针对华为海思IC笔试机考的特点,提供了方向选择建议、核心知识梳理及真题实战技巧,帮助考生构建系统性复习框架,高效备战,提升通关成功率。

mars5的博客 1311

两种快排类型

霍尔是快排算法的创始人,也就是最原始的快排。这个快排的总体思想则是首先定义一个key值,以这个值为基准,然后把待排序的数组分成左右两个区间。定义一个指针begin指向数组的左边,然后定义一个指针end指向数组的右边,如果要排升序,则begin寻找的是比key指向的元素大的值,而end则寻找的是比key指向的元素小的值,简称左边找小,右边找大。当找到小和大的时候,就会跳出循环,这两个值将进行交换。

Striveforsublime的博客 1048

ArcGIS-裁剪遥感影像及dem图像

6、选择【工具箱】-【数据管理工具】-【栅格】-【裁剪】。在【输入栅格】里选择要裁剪的dem,在【输出范围】里选择刚创建的裁剪范围。选择一个输出路径,其他参数保存默认。2、起一个名称,要素类型选择【面】。点击【编辑】选择与要裁剪的dem一致的地理坐标系。1、创建需要裁剪区域的面层shp,右击选择【新建】-【shapefile】3、点击编辑器,选择开始编辑。4、选择【裁剪范围】,点击确定。5、画出想要裁剪的范围并保存。

siwenaiyou的博客 1万+

快速排序的两种方法

快速排序的两种 思路: 1.选出一个pivot,一般是最左边或者最右边 2.定义一个start和end,start从左往右走,end从右往左走(需要注意的是:若选择最左边的数据作为pivot,则需要end先走;若选择最右边的数据作为pivot,则需要start先走) 3.在走的过程中,若是end遇到了小于pivot的数,就停下。然后start开始走,若是遇到了大于pivot的数时,这个时候交换start和end的值。如此循环下去直到start和end相遇,然后将相遇点的数和pivot交换即可。(选取

m0_58477309的博客 1068

MCP协议桥接AdsPower:AI原生时代的浏览器自动化新范式

浏览器自动化是Web开发和数据采集领域的核心技术,其核心原理是通过程序控制浏览器内核执行页面导航、元素交互和数据提取等操作。传统方案如Selenium和Playwright虽功能强大,但在管理多实例、指纹隔离等复杂场景下,配置和维护成本较高。随着AI原生应用的发展,Model Context Protocol(MCP)作为一种标准化协议,为AI助手与外部工具间的通信提供了统一接口,显著提升了自动化流程的构建效率和自然语言交互能力。通过MCP Server桥接AdsPower指纹浏览器的本地API,开发者可将

weixin_30552811的博客 296

CentOS 7下Multipath多路径存储的实战配置与性能优化

本文详细介绍了在CentOS 7系统中配置与优化Multipath多路径存储的完整实战流程。从安装部署、核心配置文件解读,到性能调优与生产环境避坑指南,全面解析如何利用Device Mapper Multipath构建高可用、负载均衡的存储链路,提升存储系统可靠性与I/O性能。

weixin_29278805的博客 320

两种快排算法对比

快排算法的核心都是选定基准数,将所有小于此基准的数放在其左侧,大于的数则放在其右侧。递归调用直到整个数组有序。 这里存档两个教程: 白话经典算法系列之六 快速排序 快速搞定_MoreWindows Blog-优快云博客_快速排序快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,

weixin_43904427的博客 334

【Python爬虫教程】第3篇-解决使用reqeusts遇到的ProxyError异常

Python request代理错误提示“HTTPSConnectionPool, Cannot connect to proxy, no such file or directory”

分享技术,记录思考和感悟 1508

C语言快速排序

快速排序(Quick Sort)概念:是由冒泡排序改进而得到的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可以消除多个逆序。 快速排序的算法步骤:在待排序的n个记录中任取一个记录(通常取第一个记录)作为枢轴(或支点),设其关键字为pivotkey。经...

mfx7700429的博客 6466

【Claude】Auto Mode 触发安全分类器拦截的三种错误变体及对应处理 bug报错已解决

深度解析Claude Auto Mode安全分类器拦截的三种变体:内容拒绝、操作中断、累积触发,含完整排查流程与绕过策略。

博客 7595

Python爬虫抓取淘宝商品详情页信息:从入门到高级技术应用

通过本篇博客,我们了解了如何使用Python爬虫抓取淘宝商品详情页的信息,如何使用requests和Selenium抓取静态和动态内容,如何应对淘宝的反爬虫机制,如何将抓取的数据保存到CSV文件等。随着爬虫技术的不断发展,开发者可以根据需要选择合适的工具和技术,如使用分布式爬虫框架提高抓取效率,或者利用OCR技术处理验证码等问题。在进行淘宝爬虫时,需要注意遵循相关法律法规和平台的爬虫政策,避免对平台造成过度的负担或侵犯其合法权益。

2201_76125261的博客 462

快速排序

一)算法介绍 快速排序是对冒泡排序的一种改进算法,属于不稳定排序。 基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另一部分的所有数据都要小,按照此方法对数据进行快速排序,以达到整个数据变成有序列表。 备注:快速排序是一种适用于数据量越大,数据分布越混乱的算法,一般被认为性能是最好的。 不稳定排序:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的...

p812438109的专栏 1010

【S32K3 MCAL配置】-3.4-CANFD配置-接收特定的“经典CAN/CANFD标准帧”和“经典CAN/CANFD扩展帧”(基于MCAL+FreeRTOS)

【S32K3 MCAL配置】-3.4-CANFD配置-接收特定的“经典CAN/CANFD标准帧”和“经典CAN/CANFD扩展帧”(基于MCAL+FreeRTOS)

「汽车电子助手」的博客 696

快速排序的两种算法

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。现在我们就来学习一下快速排序的两种形式: 快速排序的两种形式交换法埋坑法 交换法 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。先将第一个数当成基准数,然后以i, j当成哨兵分别指向数组的首尾.

weixin_45708424的博客 525

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java快速排序两种方法

public class FaskSort { private static int count0 = 0; public static void sort(int[] array){ if(array.length > 0){ sort(array, 0, array.length - 1); } } ...

Leon_190的博客 3525

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

快速排序partition过程常见的两种写法+快速排序非递归实现

快速排序partition过程常见的两种写法+快速排序非递归实现这里不详细说明快速排序的原理,具体可参考here一、快排递归方法快速排序主要是partition的过程,partition最常用有以下两种写法第一种:int mypartition(vector&lt;int&gt;&amp;arr, int low, int high) { int pivot = arr[low];//选第...

东南风的博客 943

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

编程珠玑——快速排序总结

快速排序快速排序是二十世纪最伟大的10大算法之一。如何写好一个快速排序通常不是一件容易的事,同时面试中或者实际应用中也经常要用到快速排序。编程珠玑第11章专门介绍了快速排序,涉及到了基本的算法思想实现和一些优化,这里进行简单的总结以便以后快速的回忆。基本思想快速排序用到了分治,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此

等价交换 1912

快速排序算法两种方式

快速排序算法两种方式 // 以中间的数作为中轴值 public static void quickSort(int[] arr,int left,int right){ int l = left; int r = right; int pivot= arr[(left + right)/2]; //左边小于右边,则继续循环 while(l < r) { while(arr[...

weixin_45029642的博客 284

java编程题:用Java实现一个快速排序算法

/** * java编程题:用Java实现一个快速排序算法 * * 快速排序是对冒泡排序的一种改进。 * * 快速排序的基本思想: * 通过一趟排序将要排序的数据分成独立的两部分,其中一部分的所有数据(左边的数据)都比 * 另外一部分的所有数据(右边的数据)都要小,然后再按此方法对这两部分数据分别进行快速排序, * 整个排序过程可以递归进行,以此达到整个数据变成有序

一转身就是一辈子 7770

快速排序的两种代码实现

快速排序实现的重点在于数组的拆分,通常我们将数组的第一个元素定义为比较元素,然后将数组中小于比较元素的数放到左边,将大于比较元素的放到右边, 这样我们就将数组拆分成了左右两部分:小于比较元素的数组;大于比较元素的数组。我们再对这两个数组进行同样的拆分,直到拆分到不能再拆分,数组就自然而然地以升序排列了。 不难看出,拆分算法是整个快速排序中的核心,快速排序拥有非...

进击30K的专栏 279

【编程题】快速排序

前言快速排序是面试题最常到考到的排序算法,以前在课本中学到过,后来看《算法导论》的时候也学到过。印象中,两者大体思想一样,在一些小细节上还有一些不同,这篇文章会总结一下。不过很久不写了,直接拿起来写,写了很久。。。。还被嘲笑了。。。。。1.思想快速排序主要是利用分治的思想,将问题分为较小的问题,然后分别求解。首先,选取数组中的一个数作为flag,利用这个数将数组进行分割,小于flag的数放在flag

mengaliu_123的博客 875

java两种方法实现快速排序

快速排序 快速排序就是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 1.第一种实现方法package com.quick;public class quick { public void quick_sort(int[] arrays,

时光的当铺 1396

经典快速排序与随机快速排序

文章目录一、经典快速排序(一)、经典快速排序的实现理论(二)、经典快速排序的代码实现(Java)(三)、经典快速排序的时间复杂度二、随机快速排序(一)随机快速排序的实现理论(二)随机快速排序的代码实现(Java)(三)、随机快速排序的时间复杂度 一、经典快速排序 (一)、经典快速排序的实现理论 经典快速排序是用数组的最后一个数(这里记为 x )进行划分。也就是 &amp;lt;x、=x、&amp;gt;x。 有...

liyanan的博客 3041

快速排序的两种写法

1.左端点作为关键字。 #include<iostream> using namespace std; int a[100000],n; void print() { for(int i=1;i<=n;i++) cout<<a[i]<<' '; cout<<endl; } void qsort(int start,int end) { if(start>=end) return ; int key=a[start]; int i=st

Ming-Kai 555

快速排序的两种java实现

/** * 快速排序(基于霍尔的快排) */ public int Partition(int a[],int low,int high){ int key = a[low]; int temp; int i = low;int j = high; while(i&lt;j){ w...

sinat_40553837的博客 293

快速排序的两种实现

简介快速排序是排序中速度比较快的,采用分治策略,不断递归排序。很多编程语言的sort()或者qsort()函数的底层实现就是快排。 算法导论第7章对快速排序进行了深入的探讨,而且它的划分思想与国内的许多教材不同。如严蔚敏数据结构版本选择第一个元素为中枢,从左右两端往中间逼近;而算法导论则是选择最后一个元素为中枢,两个指针一起从左到右遍历一遍进行划分。(选择中枢也是个值得探讨的问题,算法导论采取随机

LHJ884的专栏 670
上一篇: 编程之法第一章【回文判断+字符串转化成整数】
下一篇: python编程快速上手--重点整理(上)
BIGKAKA
博客等级 码龄11年 32粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值