来吧 少年 排序吧(1)

2022年9月全国青少年编程C语言一级真题答案版 全国青少年编程等级C语言一级答案版 阅读详情

为了明天即将到来的面试,为了加强记忆,在这里紧急的总结下各自排序的相关知识,

话说优快云博客里可不可以@啊。

虽然这样的帖子成千上万,不过写出来是给自己看得。

首先,第一个: 插入排序(insertion sort)

这个原理很简单,用两个指针,一个指向要排序的数字,另外一个遍历数组,来找出第一个比《要排序的数字》大或者小的数字,将要排序的数字放入合适的位置。如此遍历数组中所有的数,直到数组有序。

对于随机乱序的数组,该算法的时间复杂度为O(n^2),并且稳定。希尔排序为该排序的变种。

比较适合针对本身已经有序的数组,插入N个元素(N个数远远小于数组长度)后,使原数组仍然有序。

给一个该排序的Java实现:

public int[] insertionSort(int[] array){
		int tmp = 0;
		for (int i = 1; i < array.length; i++){
			int j;
			tmp = array[i];
			for(j=i ; j > 0 && tmp < array[j-1] ; j--){
                                array[j] = array[j-1];
			} 
			array[j] = tmp; 
		}
		return array;
	}

然后,我们复习一下稍微复杂点的,冒泡排序(bubble sort)

不过好像也复杂不到哪里去,bubble最大的优点就是易于实现,原理简单,以及稳定(其实我觉得如果要使用不如用插入,实现也简单,算法复杂度也一样,不过真的很少用吧),该算法时间复杂度为 O(n^2),排序中算是比较慢的。感觉主要用途是教学..

原理也很简单,想象一下水中的气泡,大的气泡会浮的快些,小的慢看起来慢些,如果同一时间上浮,那么最后这些气泡会是有序的。

在这里,我们将选取一个元素,然后从该元素开始遍历整个数组,如果发现两个元素顺序相反,我们就将其调换,由此,我们可知,冒泡排序效率之所以低就是因为交换的次数过多导致的。

实现代码如下

	public int[] bubbleSort(int[] array){
		int tmp = 0;
		for (int i = 1; i < array.length; i++){
			for(int j = 0; j < array.length - i; j++){
				if (array[j] > array[j+1]){
					tmp = array[j+1];
					array[j+1] = array[j];
					array[j] = tmp;
				}
			}
		}
		return array;
	}

以前经常会把前两种排序弄混,虽然原理很相似,不过注意,插入排序会直接把数组分成有序的部分和无序的部分,然后从无序的部分不断的提取元素插入有序数组。而插入排序则是不断的对无序元素进行调换,最后使元素有序。


然后,我们看一下最简单的不稳定排序 - 选择排序

选择排序的原理就是,每次选出未排序序列中的最大/最小值,将其放入数组的最后/前。n趟之后,数组有序。

这种排序方法的比较方法是恒定的O(n^2),其不稳定的地方主要体现在交换次数上,最好的情况及数组有序,我们需要交换0次,而最差情况是数组逆序,需要交换n-1次,因此,在n值较小时,选择排序效率高于冒泡排序。

java code:

	public int[] selectionSort(int[] array){
		int min = 0;
		for (int i = 0; i < array.length; i++){
			for(int j = i; j < array.length; j++){
				min = array[i];
				if (array[j] < min){
					int tmp = array[j];
					array[j] = min;
					min = tmp;
				}
				array[i] = min;
			}
		}
		return array;
	}

接下来是排序中的重头戏,个人认为是当今算法界的明星。排序方法中最常用,同时也是通常是最有效率的算法- 快速排序:

该算法是冒泡排序的改进,其原理采用了算法学中的经典思想:分而治之的思想: 首先,选出一个数(这个数一般选自数组的head或者tail,我们称之为pivot)同时,根据这个数字,我们把数组分成 比该数大 或者 比该数小 两个子数组,然后递归调用,知道数组不可再分,即使数组有序。

这个图非常好:


快速排序也是一种不稳定的排序方法,很容易想象到,在这个排序过程中,pivot在有序数组中的位置决定了其程序的执行时间,最好的情况应该是,每一次方法的调用,都会很幸运的选到这个数组的中位数,理想情况下,其复杂度为O(nlogn)。而最坏情况,每一次我们都只能选到最大值或者最小值,此时,排序便会退化为冒泡排序,执行时间O(n^2)。

另外,快速排序中必须要知道的一点就是partition,也就是分区的方法。这个算法有同学描述为挖坑添数法,个人觉得十分形象:

具体步骤为定义i,j两个指针,一个指向数组head 一个指向数组tail,当我们取出了pivot之后,我们即认为原来pivot所占的位置已经空了,我们需要另外一个数字来占据它。如果我们选取了head作为pivot,那么我们首先向前移动指向tail的指针j,直到我们遇到第一个比pivot小的数,用其添掉原来pivot的坑,而这时这个较小的数字原来所占据的位置又变成了一个坑,此时,我们便移动指向head的指针i,寻找第一个比pivot大的数,并用其添坑。做完后,j继续移动,如此反复知道i= j,最后一个坑我们便用pivot来添,而i或者j的值,便是partition的分界线。

好了上代码:

	public int[] quickSort(int[] array){
		sortPartition(array,0, array.length-1);
		return array;
	}
	
	public void sortPartition(int[] array, int start, int end){
		int i = start;
		int j = end;

		if(i >= j){
			return;
		}
		int pivot = array[start];

		while (i < j){
			while (i < j && array[j] >= pivot){
				j--;
			}
			if(i < j){
				array[i] = array[j]; 
			}
			
			while (i < j && array[i] < pivot){
				i++;
			}
			if(i < j){
				array[j] = array[i];
			}
			
		}
		array[i] = pivot;
		
		
		sortPartition(array, start, i-1);
		sortPartition(array, i+1, end);
		
	}

好了,然后是感谢时间,

感谢@MoreWindows的白话经典算法系列,我在复习快速排序算法的时候,参考了他的这篇文章:

http://blog.youkuaiyun.com/morewindows/article/details/6684558

下一次,计划总结一下堆排序,顺便分析一下堆这个数据结构。另外总结一下外部排序的算法。

另外,祈了个福,希望明天面试顺利!!

2022年9月青少年C/C++软件编程(一级)等级考试试卷及答案解析 阅读详情

相关推荐

2022 年 12 月青少年软编等考 C 语言六级真题解析

2022 年 12 月青少年软编等考 C 语言六级真题解析。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 1094

逃跑吧少年辅助快乐羊儿吧

逃跑吧少年是4399刚刚推出的一款小游戏,收到热烈欢迎,绝对的高热度2d刺激小游戏。 同时我还发过一个帖子不过被优快云删掉了,所以我来这里我自己的博客重新发一遍! 下载地址:点我下载(点击后会跳转到诚通网盘,有三个按钮,大家点击普通下载按钮,就能下载!) 转载于:https://www.cnblogs.com/xiazai/p/1026044...

weixin_30276935的博客 4万+

2022-09-17青少年软件编程(C语言)等级考试试卷(一级)解析

2022-09-17青少年软件编程(C语言)等级考试试卷(一级)解析

lybc2019的博客 564

1个少年

怕我现在不写点什么,以后就更不会写了。经常恍神,然后在心里问自己一句,我该怎么办?这一年遇到了这么多无法解决的事情。但是乐观的时候也有很多,我正是那1个少年,心态像极了王小波黄金时代里那句,谁也锤不了我。一直自认很低调,却被人说我一直很自信,其实没说错。 老妈常说,我不会做人,没有别家姑娘的机灵。我试图改变自己,最终发现人是不可以被改变的。一个人的气质,与生俱来。一个人的命途,早已注定。会想做更n

Enjolras_fuu的博客 1224

2024 年 3 月青少年软编等考 C 语言六级真题解析

2024 年 3 月青少年软编等考 C 语言六级真题解析。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 949

202209 青少年软件编程等级考试C/C++ 一级真题答案及解析(电子学会)

中国电子学会202209青少年编程等级考试C/C++一级真题答案及解析

白昼的技术专栏 398

青少年编程能力等级测评CPA C++(三级)-试卷1

CP3_1_11.已知货币面值为100元、50元、20元、10元、5元、1元,购买价格为n元的商品,恰好完成支付,至少需要支付几张货币。CP3_1_14.对如图所示的二叉树进行深度优先遍历,用栈存储访问到的节点,则第5个入栈的节点值是( )。CP3_1_20. 设Demo为已定义的一个类,则下列有关该类的对象定义语句,正确的有( )。CP3_1_7.下列各组数据,用冒泡排序法进行从小到大排序,则需要交换次数最多的是( )。CP3_1_17.下列有关局部最优解和全局最优解的叙述中,正确的有( )。

轻描时光 1109

2022年09月青少年软件编程(C语言)等级考试试卷(一级) 试题解析

2022年09月青少年软件编程(C语言)等级考试试卷(一级) 试题解析

http://www.cierobot.com 345

第五届上海市青少年算法竞赛 题解

第五届上海市青少年算法竞赛 题解

超哥聊信奥 1970

2022年09月-电子学会青少年等级考试C语言(一级)真题与解析

2022年09月-电子学会青少年等级考试C语言(一级)真题与解析

~ 1700

【前后缀分解 排序】B4274 [蓝桥杯青少年组省赛 2023] 数字游戏|普及+

题目摘要: 该题要求对给定数组进行调整,规则为交替将最小值调整为第二小值、最大值调整为第二大值,直到数组中不同数字少于3个为止。需要计算总调整次数以及最终的最小值和最大值。输入包含数组长度N和N个正整数,输出三个整数:调整次数、最终最小值和最大值。解题关键在于排序后使用前后缀分解方法预处理调整次数,通过比较前后缀确定最优解。时间复杂度为O(n),适用于大规模数据(N≤1,000,000)。示例说明当数组元素差异不足时会直接结束调整。

闻缺陷则喜何志丹 614

青少年编程能力等级测评CPA C++五级试卷(1)

CP5_1_18.执行下列代码,若输出结果为:“2023-3-20”,则/***code***/处可以填写的代码有( )。(2)编程过程中对于程序给定的部分不允许修改,考生仅允许在/****code****/提示行区间内作答。(2)编程过程中对于程序给定的部分不允许修改,考生仅允许在/****code****/提示行区间内作答。说明:编程过程中对于程序给定的部分不允许修改,考生仅允许在/****code****/提示行区间内作答。CP5_1_16.下列有关类的组合和继承的叙述中,正确的有( )。

轻描时光 1393

逃跑按钮的巧妙实现

逃跑按钮的巧妙实现

11届蓝桥杯青少年组C++全国赛高级组 六.编程实现:求阶乘(python3实现)

""" 六.编程实现:求阶乘 https://blog.csdn.net/lybc2019/article/details/120457450 提示信息:阶乘定义:一个正整数的阶乘是所有小于及等于该数的正整数的乘积。 例如:3的阶乘6(也就是1*2*3的结果) 例如:5的阶乘120(也就是12*3*4*5的结果) 题目描述:输入一个正整数N(3<=N<=20),输出1到N之间(包含1和N)所有正整数阶乘的和。 例如:输入为3,1的阶乘为1,2的阶乘为2,3的阶乘为6, 1+2+6=9,则输出.

青少年趣味编程 1442

少年课程

少年课程

光线追踪渲染实战:蒙特卡洛路径追踪及其c++实现

光线追踪超越了传统的图形流水线,是一种现代的渲染。光线追踪是一种基于物理的渲染方法,通过模拟光在介质中的真实表现来输出足以逼近现实的图像。光线从光源出发,经过各种反射折射,进入摄像机。通过渲染方程描述一点的颜色,并且通过蒙特卡洛方法求解渲染方程来获取最终的像素颜色。

AKGWSB 's blog 1万+

绍兴市第七届青少年编程复赛题目(2008)

绍兴市第七届青少年编程复赛题目(2008): 01:明明的随机数 02:尼科梅彻斯定理 03:喝醉的狱卒 04:3n+1数链问题

Zff121017的博客 1150

勒索病毒c语言源代码,勒索病毒原理解析

一、编程思路什么是勒索病毒:遍历你电脑上所有文件,并且用加密算法加密,然后把加密秘钥发送到自己邮箱里,弹出窗口。工具:操作系统API,加密算法思路:1.程序设计 思路规划清楚1.1 加密单个文件1.2 遍历文件系统并加密文件2.工程实现: 编程3.测试上线 :、测试欢迎加入学习群【892643663】,获取全套免费C/C++企业实战级课程资源(素材+源码+视频)和编译大礼包二、代码解析//文件遍...

weixin_35355756的博客 6601

2022 年 9 月青少年软编等考 C 语言一级真题解析

2022 年 9 月青少年软编等考 C 语言一级真题解析。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 1612

Shopee商品详情页反爬实战:手把手逆向x-sap-Ri和x-sap-Sec请求头加密

本文详细解析了Shopee商品详情页反爬机制中x-sap-Ri和x-sap-Sec请求头参数的加密逻辑,通过JS逆向技术手把手教你定位加密入口、分析哈希算法与对称加密实现,并提供完整实战案例和应对反爬策略的高级技巧,助力开发者突破电商平台数据采集难点。

weixin_27875131的博客 1824

【8】mctp & pldm

异步会check seq,保证不丢包,虽然发一条req,不用等,但是不能发下一条req,等上条response回来后才能发下一条。TO(tag owner)=1是request,TO=0是response,但是异步通信response由0改为1。如下还有kcs,i3c,serial等。

持续更新ing... 1080
上一篇: 给自己加油
下一篇: Ubuntu下 ruby gem/rails运行提示rubygems.rb文件装载错误(LoadError)修复方法
Anar0821
博客等级 码龄15年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值