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

前面看到有人发了数组排序的代码,想起自己前阵子为了应付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书上没有讲,都比较简单)

 

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

相关推荐

VUE3如何使得大屏自适应的几种方法?

16:9。

weixin_42711805的博客 1万+

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

DC综合中set_dft_signal的实战配置与优化策略

本文深入解析了DC综合中set_dft_signal命令的实战配置与优化策略。文章从命令的核心作用出发,详细拆解了-view、-type、-usage等关键参数,并通过扫描使能与时钟门控的实战案例,展示了如何正确配置以实现测试模式下的功耗优化。同时,文章总结了高级优化策略、与低功耗流程的协同方法以及常见错误排查清单,旨在帮助数字芯片设计工程师构建高可测性、低功耗的稳健DFT基础。

weixin_28347369的博客 403

排序算法总结(Python版)

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

Dby_freedom的博客 2万+

前沿数据解析 | 麻省理工-斯坦福-丰田研究中心电池数据集:AI驱动下的电池寿命早期预测

本文解析了麻省理工、斯坦福与丰田研究中心联合发布的电池数据集,展示了AI驱动下的电池寿命早期预测技术。通过分析124个商用锂离子电池的完整生命周期数据,研究团队仅用前100次循环数据即可准确预测电池报废时间,为电动汽车电池管理提供革命性解决方案。数据集包含LFP/石墨体系电池的详细测试记录,结合差分容量分析和梯度提升树模型,预测精度显著提升。

weixin_26950847的博客 529

利用GeoTools高效切割GeoTIFF为WebP瓦片:从配置到实战

本文详细介绍了如何利用GeoTools将GeoTIFF高效切割为WebP瓦片,从环境配置到实战技巧全面覆盖。通过对比WebP与PNG格式的优势,展示其在体积压缩和传输效率上的显著提升,并提供多线程切割、内存管理等性能优化方案,帮助开发者快速实现地理空间数据的Web地图服务部署。

agile9scrum的博客 815

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

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

MaYuKang的博客 343

VM与欧姆龙PLC通讯设置实战:Fins TCP/UDP协议详解

本文详细解析了VM(VisionMaster)与欧姆龙PLC通过Fins TCP/UDP协议进行通讯的实战设置。内容涵盖网络配置、协议选择(TCP可靠性与UDP实时性)、VM端地址映射与数据点添加、以及数据接收解析流程,并提供了常见错误排查与高级调试技巧,帮助视觉与自动化工程师快速实现稳定可靠的工业通讯集成。

weixin_29172963的博客 328

基于比较的七大排序算法

排序算法+练习题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

WOFOST作物模型(7):6.0.6版本的PCSE使用(多层水分平衡和SNOMIN碳氮模型的集成)

wofost81文件结构如上,其中所需的参数可从github上获取然后input下有两个需要调用的功能函数py文件,需要拖到自己的运行py文件同级目录下在使用土壤模块SNOMIN进行作物生长模型模拟时,需要为土壤剖面的不同层次提供多种输入变量。这些变量通常不随年份变化,因此会统一在土壤文件中定义。本节将说明如何将这些输入变量整合到一个字典中,进而生成SNOMIN能够读取的土壤文件。

所有专家都曾始于新手 638

LeetCode --- 937. Reorder Data in Log Files 解题报告

You are given an array oflogs. Each log is a space-delimited string of words, where the first word is theidentifier. There are two types of logs: Letter-logs: All words (except the identifier) consist of lowercase English letters. Digit-logs: All word..

杨鑫newlife的专栏 426

内部排序算法的比较

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

极客园地 1156

微信小程序 - 解决微信支付报错 requestPayment:fail no permission 原因分析及排查处理(支付失败出错,无法唤起支付弹框面板,微信支付API报错请求付款:失败无权限)

微信小程序,微信支付,支付报错,errMsg: "requestPayment:fail no permission",支付失败,支付权限没问题,微信小程序支付报错,检查了appid正确依旧不行,微信小程序支付异常,苹果ios手机,安卓手机,开发者工具模拟器,最新解决教程,小程序wx.requestPayment报错/无响应,小程序支付 requestPaym,微信小程序认证,真机运行,小程序微信支付提示错误,微信小程序里使用微信支付错误提示,微信小程序支付异常,微信支付弹框拉不起来,小程序支付api,都检

🏆 前端领域优质创作者 1万+

排序算法复习

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

qq_39861376的博客 690

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

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

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

帅地 4831

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

排序算法总结和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

排序算法--考研复习

数组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、付费专栏及课程。

余额充值