比较排序算法的简单复习(说明+代码)

前面看到有人发了数组排序的代码,想起自己前阵子为了应付xxxxxx公司笔试复习时写下的一些关于比较排序算法 的笔记和代码,拿出来和大家分享一下,攒点RP:

(代码基本是按照《算法导论》的伪代码写的,lgn是以2为底的,西塔估计打不出,我这里都用O了)

 

1、Insertion Sort

遍历数组,将小的值插在前面。

是原地、 稳定 的排序算法。复杂度O(n^2)

a = [5,2,4,6,1,3]
p a

for j in 1...a.size
	key = a[j]
	i = j - 1
	while i >=0 and a[i] > key
		a[i + 1] = a[i]
		i -= 1
	end
	a[i + 1] = key
end

p a

2、Merge Sort

递归排序A[1..n/2] A[n/2+1..n],然后合并两端已排序序列,当n=1时排序完成。

是非原地、非稳定 的排序算法。复杂度O(nlgn)

def merge (arr, s, mid, e)
	n1 = mid - s + 1
	n2 = e - mid
	
	left = arr[s..mid]
	right = arr[mid + 1..e]
	
	i = j = 0
	for index in s..e
		if i < n1 and j < n2
			if left[i] < right[j]
				arr[index] = left[i]
				i += 1
			else
				arr[index] = right[j]
				j += 1
			end
		else
			arr[index..e] = left[i...n1] if i < n1
			arr[index..e] = right[j...n2] if j < n2
		end
	end
end

def merge_sort(arr, s, e)
	if s < e
		mid = (s + e) / 2
		merge_sort arr, s, mid
		merge_sort arr, mid + 1, e
		merge arr, s, mid, e
	end
end

a = [5,2,4,6,1,3]
p a
merge_sort a, 0, a.size - 1
p a

3、Quick Sort

将数组A[p..r]分成A[p..q-1]和A[q+1..r](可能有空数组),前者小于A[q],后者大于A[q];对两个数组分别进行Quick Sort。

是原地、非稳定 的排序算法,最坏运行时间O(n^2),平均运行时间O(nlgn)。

def partition arr, start_index, end_index
	x = arr[end_index]
	i = start_index
	
	(start_index...end_index).each do |j|
		if arr[j] <= x
			arr[j], arr[i] = arr[i], arr[j]
			i += 1
		end
	end
	arr[i], arr[end_index] = arr[end_index], arr[i]
	p arr
	i
end

def quick_sort arr, start_index, end_index
	if start_index < end_index
		pivot = partition arr, start_index, end_index
		quick_sort arr, start_index, pivot - 1
		quick_sort arr, pivot + 1, end_index
	end
end

a = [5,2,4,6,1,3]
p a
quick_sort a, 0, a.size - 1
p a

4、Heap Sort

堆可以被看作一棵完全二叉树;数组表示时,结点i,parent为[i/2],left为2i,right为2i+1;长度为n的数组表示堆, [n/2]+1到n都为叶结点。([]表示取下底)

堆排序使用最大堆,先构建最大堆,取出堆顶元素放在最后,堆的元素数减1,维护最大堆性质,再取出堆顶元素,直至完全排序。

是原地、非稳定 的排序算法,MAX_HEAPFIER时间为O(lgn),BUILD_MAX_HEAP为O(n),HEAP_SORT为O(nlogn)。

def max_heapfier arr, root_index, heap_size
	left_index = root_index * 2
	right_index = left_index + 1
	max_index = root_index
	max_index = left_index if left_index < heap_size && arr[left_index] > arr[root_index]
	max_index = right_index if right_index < heap_size && arr[right_index] > arr[max_index]
	unless max_index == root_index
		arr[root_index], arr[max_index] = arr[max_index], arr[root_index]
		max_heapfier arr, max_index, heap_size
	end
end

def build_max_heap arr, root_index, heap_size
	(heap_size / 2).downto(0) { |i| max_heapfier arr, i, heap_size}
end

def heap_sort arr
	build_max_heap arr, 0, arr.size
	heap_size = arr.size
	(heap_size - 1).downto(1) do |i|
		arr[0], arr[i] = arr[i], arr[0]
		heap_size -= 1
		max_heapfier arr, 0, heap_size
	end
end

a = [5,2,4,6,1,3]
p a
heap_sort a
p a

5、Selection Sort

遍历数组,每次取出最小的元素。

是原地、稳定 的排序算法,复杂度O(n^2)。

def get_min(arr, b, e)
	min_index = b
	for i in b..e
		min_index = i if arr[i] < arr[min_index]
	end
	min_index
end

a = [5,2,4,6,1,3]
p a
for i in 0...a.size
	index = get_min a, i, a.size - 1
	a[i], a[index] = a[index], a[i]
end
p a

6、Bubble Sort

遍历数组,邻近的两两比较,小的放前面,直到最小的移到最前面,重复这个过程,直至排序完毕。

是原地、稳定 的排序算法,复杂度O(n^2)。

a = [5,2,4,6,1,3]

def bubble_sort arr
  (0...arr.size).each do |i|
    (arr.size - 1).downto i do |j|
      arr[j], arr[j - 1] = arr[j - 1], arr[j] if arr[j] < arr[j - 1]
    end
  end
end

p a
bubble_sort a
p a

 (5出现在习题里,6书上没有讲,都比较简单)

 

数据结构 | 各种排序算法梳理 | 复习版 本篇为对先前学习笔记中所涉及到的排序算法的学习整理,主要用于期末复习梳理,重点侧重于算法思想。 阅读详情

相关推荐

yolov5 部署jetson nano(通用) 保姆级教学

Jetson nano从配置环境到yolov5成功推理检测全过程 文章目录Jetson nano从配置环境到yolov5成功推理检测全过程一、烧录镜像二、配置环境并成功推理1.更新系统和包2、配置环境2.1 配置CUDA2.2 修改Nano板的显存1.打开终端输入:2.修改nvzramconfig.sh文件:3.重启:4.终端输入:3、安装archiconda(也就是jetson nano板上的anaconda)1.下载地址:2.安装:3.测试conda:4.创建运行yolov5的虚拟环境:5.在conda

weixin_44312422的博客 3万+

10种排序算法及代码实现

十大经典排序算法 0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 0.2 算法复杂度 0.3 相关概念 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b

weixin_45548912的博客 2228

【顾邦小讲堂】第二十四期 电源环路测试从入门到精髓:一文掌握环路测试原理与电压注入点选择依据

电源环路测试是评估开关电源、线性电源等闭环系统稳定性的核心手段,直接关系到电源的稳定性、输出精度、动态响应、抗干扰能力甚至可靠性

GBupupup的博客 2111

排序算法总结(Python版)

经典排序算法总结与实现 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用Python实现了七大经典排序算法,包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序。希望能帮助到有需要的同学。

Dby_freedom的博客 2万+

STM32F103C8T6通过ESP8266连接阿里云物联网平台(附代码)

STM32F103C8T6连接阿里云物联网平台(1)—阿里云lot Studio控制 Web开发 分享一下自己使用stm32f103c8t6通过ESP_01模块连接阿里云物联网平台,实现温湿度上传和控制命令下达的过程,能力有限,用的是最简单的方法,如有错误,多多担待。 一、硬件选型 1、 stm32f103c8t6 2、ESP_01 wifi模块 3、其他 二、硬件连接 WSP_01 STM32F103C8T6 RXD PA2 TXD PA3 RES PA4 VCC 3.3

weixin_A13253323604 3万+

一文读懂“数据分发服务DDS”(Data Distribution Service,RTPS,OMG)

DDS 数据分发服务(Data Distribution Service) 数据分发服务DDS(DataDistributionService)是对象管理组织(OMG)在HLA及CORBA等标准的基础上制定的新一代分布式实时通信中间件技术规范,DDS采用发布/订阅体系架构,强调以数据为中心,提供丰富的QoS服务质量策略,能保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。DDS...

DDS技术交流推广大本营 4万+

常见排序算法基本原理、步骤及代码(含注释java版),小白也能看的懂!

本文所有排序均为从小到大排序,代码全部可跑通。 基数排序 思想:任何数的每个位数只有可能是0~9,也就是10个数,从个位开始到最高位结束。 步骤: 1、准备一个长度为10的二维数组,一维下标也就是0~9。 2、得到待排序数组最高位。 3、遍历数组,从个位开始截取,到最高位结束,将数字放到截取位数对应下标的二维数组中。 4、从二维数组中按顺序取出新的数组。 5、如果数字没有截取到位数,那就是已经排序好的了,循环步骤3~步骤4,直至排序完成。 归并排序 思想:将一个数组从中间分开,再将左右两个数组分别排序后合并

MaYuKang的博客 343

一位海外开发者的 OpenSPG KAG 实践分享

KAG 是一个以创建和操作知识图谱为核心的框架。知识图谱是数据之间相互关联的可视化和结构化表示,对于搜索引擎、推荐系统和机器学习等应用至关重要。KAG 的目标是提供一个强大的平台,使开发者能够:轻松构建图谱;通过增强算法丰富数据;集成人工智能,以进行更精确的推理。通过理解 KAG,可以明显看出,这个框架旨在帮助从初学者到专业开发者,在项目中创造更优的解决方案。它在简便性和集成方面的优势,使其成为下一代基于数据的应用程序的前景工具。

金融机器智能社区 3405

基于比较的七大排序算法

排序算法+练习题1.时间复杂度O(n^2)级排序算法1.1 冒泡排序 1.时间复杂度O(n^2)级排序算法 1.1 冒泡排序 冒泡排序,入门级算法,通常情况下,有三种写法: 1.首先是基础写法,一边比较一边向后两两交换,将最大值/最小值冒泡到最后一位: int temp = -1; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] &

博主是个二次元死肥宅~ 2817

AgentScope实战训练营-Java开发HITL人机协作AI应用完整指南

本文手把手带你从零搭建一个基于 Spring Boot WebFlux + AgentScope + 通义千问的人机协作(HITL)AI 聊天应用。项目涵盖流式对话、工具调用、高危操作确认、对话中断、动态 MCP 工具接入、中英文双语界面等完整功能。文章从环境准备、pom.xml 配置、DTO 数据模型、Hook 机制、AgentService 核心服务、ChatController 接口到前端 HTML/CSS/JS 实现,逐一讲解每行代码的设计意图,并附带 REST API 接口说明、测试场景、常见问题

program哲学 713

UEFI 基础教程 (零) - 目录

UEFI 基础教程 (十八) — UEFI Build Process简单分析。UEFI 基础教程 (十五) — 获取UEFI MemoryMap。UEFI 基础教程 (六)   —  PROTOCOL 简单使用。UEFI 基础教程 (十)   —  FileIO 简单使用。UEFI 基础教程 (一)   —  搭建UEFI开发环境。UEFI 基础教程 (九)   —  EVENT 简单使用。UEFI 基础教程 (七)   —  HOB 简单使用。UEFI 基础教程 (八)   —  PCD 简单使用。..

技术联盟 1536

内部排序算法的比较

最近对内部排序进行复习,深入掌握各种排序算法的思想、排序过程和特征,对一些常用排序算法的关键代码进行比较,最终为了在工作中看到特定序列有选择最优排序算法的能力。 一、直接插入排序 这种排序的思想是,在待排序的数组中,设置一段排序区间让他始终保持有序并不断增大,直到覆盖整个数组,就完成了对数组的排序。 这就是最简单的直接插入排序,它的时间复杂度 是 O(N)~O(N^2) 当待排序集合本身接近有序时,它的时间复杂度最小, 当待排序集合本身时逆序集合时,它的时间复杂度最大 具体代码如下: void Direct

极客园地 1156

【通信】多径衰落信道的matlab仿真

1 简介 2 部分代码 clearf_c=1e3; %carrier frequency(no modulation)time_1 = (linspace (0, 10, 1000)); %timesignal_in = sin (2 * pi *f_c* time_1); %sine wave plot (time_1, signal_in, 'b');grid on;

qq_59747472的博客 1382

排序算法复习

目录 一、插入排序(直接插入排序、折半插入排序、希尔排序) 二、交换排序(冒泡、快排) 三、选择排序 四、归并排序 五、基数排序(桶排序) 六、总结见下表 一、插入排序(直接插入排序、折半插入排序、希尔排序) 基本思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。 1.直接插入排序: 有序序列L[1...i-1] L(i) 无序序列L[i+1...n] 简单来说,就是从有序序列中找到L(i)可以插入的位置k,将L(i)临时存放到

qq_39861376的博客 690

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

专门为学弟学妹写的十大排序算法(背诵版+动图+代码)

文章来源于:https://wwww.iamshuaidi.com,一个专注于校招,面试,面经的编程网站 说明 十大排序算法可以说是每个程序员都必须得掌握的了,如果你们像从 0 详细学习每一篇,那么你们可以看前面的文章。 但是呢,有些人可能已经学过,想要快速复习一下,看看代码怎么写的,那么可以看这篇十大排序极简汇总,并且如果你想详细复习,也有对应的详细文章哦 术语铺垫 有些人可能不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下: 1、稳定排序:如果 a 原本在 b 的前面,且.

帅地 4831

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

排序算法总结和java实现

排序算法总结和java实现0、排序算法说明0.1 排序的定义0.2 术语说明0.3 算法总结0.4 算法分类0.5 比较和非比较的区别1、冒泡排序1.1 算法描述1.2 动图演示1.3 代码实现1.4 算法分析2、选择排序2.1 算法描述2.2 动图演示2.3 代码实现2.4算法分析3、插入排序3.1 算法描述3.2 动图演示3.3 代码实现3.4 算法分析4、归并排序4.1 算法描述4.2 动图...

coffee_dount的博客 1065

OV9734 DATASHEET,完整规格书

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

排序算法--考研复习

数组int a[10]={10,9,8,7,6,5,4,3,2,1};

weixin_47696370的博客 263

十大排序算法及代码解析

作为一个程序设计人员,必须要懂算法和数据结构,这是每个毕业生必备的知识,最近在复习排序算法,进行全部的总结和介绍,但愿可以给学习排序算法的有所帮助,其中会有java和JavaScript的代码进行介绍。 一、十大排序算法 首先从一张大图来了解这十种排序算法的基本认识和比较,主要从时间复杂度和空间复杂度来介绍,图片是网上找的,不是自己做的。 1....

小菜鸟 730

十种常见排序算法的思想、应用场景、C++代码实现及时间效率直观对比

前言: 写在这篇博客前面,最近发现自己做事学东西远没有以前的踏实,往往学过之后很快就忘记,包括基础的排序算法,虽然看过几遍,但是却没有真正掌握,到了突然需要自己抛开书本手写的时候,发现自己对它们其实挺陌生的。所以希望借写这篇博客的机会,让自己好好复习一下基本的排序算法,也希望自己从现在开始能做到学东西像之前一样踏实。 这篇博客中包含的排序算法主要有:冒泡排序,插入排序,希尔排序,选择排...

Hairy_Monsters的博客 7870

排序算法最强总结及其代码实现(Python/Java)

前言 本文总结了常用的全部排序算法,内容包括: 排序算法的定义和思路,动画演示 排序算法的代码实现:Python和Java,包括实现中需要注意的细节 排序算法性能分析:时间空间复杂度分析,稳定排序算法背诵口诀等 不同排序算法最佳使用场景 此文干货颇多,烦请收藏后慢慢研读。 面试知识点复习手册 此文属于知识点复习手册专栏内容,你还可以通过以下两种途径查看全复习手册文章导航: 关注我的公众号:...

weixin_33752045的博客 379

十大排序算法汇总

涵盖。

weixin_47868976的博客 1090

java排序算法复习比较

更新中。 排序java 排序算法说明 排序的定义 对一序列对象根据某个关键字进行排序。 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个...

安迪爸爸 312

排序算法复习——插入类排序

文章目录排序的定义排序的基本操作、性质和分类排序算法1.插入排序2.读入数据总结 排序的定义 假设数据集合S,一个排序算法sort的功能就是将S的任意元素序列重新排列成一个有序的序列。 显然,对于同一集合的实际数据来说,完全可能存在很多中不同但都有实际意义的序,而且在不同的计算情况下,可能需要对同一个数据序列做不同的排序。因此在对某些数据集做排序时,需要明确说明采用哪种序,比如常用的典型序:整数的“小于等于”、字符串的字典序等。 排序的基本操作、性质和分类 基本操作:(1)比较关键码的操作(这里的

zhangzhang_one的博客 331

快速排序输出每一趟过程代码_Java七种排序算法以及实现

最近学习一些排序算法,怕自己以后忘记就打算整理起来供自己复习萌新一枚学习Java没多久,以下仅供参考。如有错误希望大佬指正,欢迎大家在评论区交流探讨。1.冒泡排序通过待排序的序列从前往后依次比较相邻的元素,若发现逆序则两两交换,直到下一趟排序下来没有进行交换,说明排序完成冒泡排序每一趟会确定一个最大值(默认从小到大)import java.util.Arrays; public class Bu...

weixin_34297863的博客 2659
上一篇: 很囧的Ubuntu 8.10硬盘安装过程
下一篇: 比较排序算法的简单复习(说明+代码)
dingx
博客等级 码龄24年 67粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值