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

7- 排序算法 排序算法有很多种,平时记不住无所谓(现在都是各种高级API,自己写那有哪些高级API稳定啊,除非你能自己发明一种更加高效的排序算法),面试前那几种关键的一定要记住(思路、复杂度哪些)。【注】:本节排序算法都是以小到大排序。 阅读详情
前面看到有人发了数组排序的代码,想起自己前阵子为了应付xxxxxx公司笔试复习时写下的一些关于比较排序算法 的笔记和代码,拿出来和大家分享一下,攒点RP:

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

1、Insertion Sort

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

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

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

  3. for j in 1...a.size
  4.     key = a[j]
  5.     i = j - 1
  6.     while i >=0 and a[i] > key
  7.         a[i + 1] = a[i]
  8.         i -= 1
  9.     end
  10.     a[i + 1] = key
  11. end

  12. p a
2、Merge Sort

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

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

  1. def merge (arr, s, mid, e)
  2.     n1 = mid - s + 1
  3.     n2 = e - mid
  4.     
  5.     left = arr[s..mid]
  6.     right = arr[mid + 1..e]
  7.     
  8.     i = j = 0
  9.     for index in s..e
  10.         if i < n1 and j < n2
  11.             if left[i] < right[j]
  12.                 arr[index] = left[i]
  13.                 i += 1
  14.             else
  15.                 arr[index] = right[j]
  16.                 j += 1
  17.             end
  18.         else
  19.             arr[index..e] = left[i...n1] if i < n1
  20.             arr[index..e] = right[j...n2] if j < n2
  21.         end
  22.     end
  23. end

  24. def merge_sort(arr, s, e)
  25.     if s < e
  26.         mid = (s + e) / 2
  27.         merge_sort arr, s, mid
  28.         merge_sort arr, mid + 1, e
  29.         merge arr, s, mid, e
  30.     end
  31. end

  32. a = [5,2,4,6,1,3]
  33. p a
  34. merge_sort a, 0, a.size - 1
  35. 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)。

  1. def partition arr, start_index, end_index
  2.     x = arr[end_index]
  3.     i = start_index
  4.     
  5.     (start_index...end_index).each do |j|
  6.         if arr[j] <= x
  7.             arr[j], arr[i] = arr[i], arr[j]
  8.             i += 1
  9.         end
  10.     end
  11.     arr[i], arr[end_index] = arr[end_index], arr[i]
  12.     p arr
  13.     i
  14. end
  15. def quick_sort arr, start_index, end_index
  16.     if start_index < end_index
  17.         pivot = partition arr, start_index, end_index
  18.         quick_sort arr, start_index, pivot - 1
  19.         quick_sort arr, pivot + 1, end_index
  20.     end
  21. end
  22. a = [5,2,4,6,1,3]
  23. p a
  24. quick_sort a, 0, a.size - 1
  25. 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)。

  1. def max_heapfier arr, root_index, heap_size
  2.     left_index = root_index * 2
  3.     right_index = left_index + 1
  4.     max_index = root_index
  5.     max_index = left_index if left_index < heap_size && arr[left_index] > arr[root_index]
  6.     max_index = right_index if right_index < heap_size && arr[right_index] > arr[max_index]
  7.     unless max_index == root_index
  8.         arr[root_index], arr[max_index] = arr[max_index], arr[root_index]
  9.         max_heapfier arr, max_index, heap_size
  10.     end
  11. end

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

  15. def heap_sort arr
  16.     build_max_heap arr, 0, arr.size
  17.     heap_size = arr.size
  18.     (heap_size - 1).downto(1) do |i|
  19.         arr[0], arr[i] = arr[i], arr[0]
  20.         heap_size -= 1
  21.         max_heapfier arr, 0, heap_size
  22.     end
  23. end

  24. a = [5,2,4,6,1,3]
  25. p a
  26. heap_sort a
  27. p a
5、Selection Sort

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

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

  1. def get_min(arr, b, e)
  2.     min_index = b
  3.     for i in b..e
  4.         min_index = i if arr[i] < arr[min_index]
  5.     end
  6.     min_index
  7. end

  8. a = [5,2,4,6,1,3]
  9. p a
  10. for i in 0...a.size
  11.     index = get_min a, i, a.size - 1
  12.     a[i], a[index] = a[index], a[i]
  13. end
  14. p a
6、Bubble Sort

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

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

  1. def bubble_sort arr
  2.   (0...arr.size).each do |i|
  3.     (arr.size - 1).downto i do |j|
  4.       arr[j], arr[j - 1] = arr[j - 1], arr[j] if arr[j] < arr[j - 1]
  5.     end
  6.   end
  7. end

  8. a = [5,2,4,6,1,3]
  9. p a
  10. bubble_sort a
  11. p a
(5出现在习题里,6书上没有讲,都比较简单)


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

相关推荐

ms17-010 永恒之蓝漏洞利用+抓包分析过程

一、实验环境: 1、攻击机:Kali 1)攻击工具:msf 2)分析工具:wireshark 3)IP地址:192.168.204.157(自动获得) 2、靶 机:Windows7 1)版本:SP1 2)开启网络共享(SMB协议) 3)关闭防火墙 4)IP地址:192.168.204.150(自动获得) 3、网卡连接方式:Vmnet8(NAT) 二、实验步骤: ...

qq_41976183的博客 6947

基于比较的七大排序算法

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

使用电荷放大器处理压电加速度计输出

电阻器 R p模拟传感器的绝缘电阻,为产生的电荷创建泄漏路径。在此图中,顶部波形显示传感器产生的电荷,而底部波形显示电荷放大器的输出。这需要具有大输入阻抗的放大级,以防止产生的电荷通过与传感元件并联的放大器的输入阻抗泄漏。换句话说,电荷放大器补偿传感器产生的电荷 q p ,反馈电容器 C F中具有相反极性的等量电荷。因此,任何与传感器并联的绝缘电阻,如电缆的绝缘电阻或传感器的漏电电阻Rp,都不能流过电流。漂移是指电荷放大器输出在一段时间内发生的变化,而不是由被测物理参数的变化(我们讨论的加速度)引起的。

weixin_45260069的博客 3905

内部排序算法的比较

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

极客园地 1156

基于集成运放心电放大器设计(原创)

原创作者:einyboy or alert 最近在看美剧《危机边缘》关于边缘科学的案件,科技控可以看一下,但建议不在吃东西的时候看。想像力是创造的思想源头,动手能力则是创造的车床。 自认为是没有想像力的那类,只能发挥动手能力了。 心电测量简介 图1 心电极接线图 如图1心电测试一般使用3个心电极进行测量,各个电极的说明如下: RA: Right Arm缩写,右手电极 LA: L...

huandaohack的专栏 6924

DBC到ARXML:AUTOSAR CAN通信栈自动化配置完整指南

在AUTOSAR架构下,DBC(CAN数据库文件)与ARXML(AUTOSAR XML)分别扮演着描述总线通信和ECU内部配置的关键角色。DBC定义了网络上的报文与信号,而ARXML则是AUTOSAR工具链交换配置数据的标准格式。在实际的ECU开发中,如何将DBC中的通信信息高效、准确地转换为ARXML,并自动生成可编译的CAN通信栈BSW配置,是许多工程师面临的痛点。借助DaVinci Configurator等工具,我们可以通过自动化导入链路消除手工映射带来的字节序错误、信号起始位偏差等高风险问题,大幅

weixin_34183910的博客 536

排序算法复习

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

qq_39861376的博客 690

外设高级定时器互补输出带死区控制实验

外设高级定时器互补输出带死区控制实验

ff_juju的博客 1652

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

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

帅地 4831

Unity Shader Graph 2D - Procedural程序化图形转动的环状六边形

Hexagon又称六边形,在游戏中是十分常见的基础形状,本文将使用程序化的六边形来制作多个环状六边形叠加的转动动画效果,实践Unity Shader Graph中的常用节点功能。

Giver的博客 1928

一文搞懂YOLO各版本差异:v5易用、v8多任务、v10低延迟,该怎么选?

YOLOv5的“易用”是为了降低入门门槛,适合新手启蒙和旧项目维护;YOLOv8的“多任务”是为了满足工业需求,成为目前的主流版本;YOLOv10的“低延迟”是为了适配边缘计算,代表未来的发展趋势。选型的核心不是“选最新的”,而是“选最适合自己场景的”。记住选型口诀,按场景对号入座,就能避开99%的坑。希望这篇文章能帮你彻底搞懂各版本差异,选对属于自己的YOLO版本!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1169

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

uniapp | 基于高德地图实现位置选择功能(安卓端)

在uni-app项目中实现地图位置选择功能的解决方案。由于uni.chooseLocation功能受限,采用高德地图API自主开发。系统由父组件poiMap.vue(负责展示和跳转)和子组件poiBox.vue(核心地图逻辑)构成,通过父子组件通信传递位置数据。关键技术包括:1)使用AMapLoader动态加载地图SDK;2)集成PositionPicker实现拖拽选点;3)异步加载AMapUI插件;4)通过事件监听获取位置详情(地址/经纬度)。

大胆尝试,小心实践 732

排序算法--考研复习

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

weixin_47696370的博客 262

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

十大排序算法及代码解析

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

小菜鸟 730

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

Hairy_Monsters的博客 7870

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

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

排序算法最强总结及其代码实现(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

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

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

weixin_34297863的博客 2659

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

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

zhangzhang_one的博客 331

十大经典排序算法最强总结(含JAVA代码实现 +算法Gif动图)

最近在复习排序算法,对于算法自己理解的总是不那么透彻,所以在网络上搜索到有很多优秀的总结,借前辈们的经验来灌输一下自己,也不失为一件有效的学习方法,更有效的学习和记忆,适合自己的都是好方法。这里总结了十大经典排序算法,并且有Gif动图,让你学习起来一目了然,快来一起学习吧。

宝弟弟的博客 8562

冒泡排序、快速排序多个排序算法的原理及比较

文章目录冒泡排序插入排序选择排序希尔排序计数排序基数排序桶排序堆排序归并排序快速排序 此篇笔记用于记录各种排序算法的原理,不做具体的对比与更加深入的研究。 注意:以下原理与举例均以按照从小到大排序说明。 示例代码均以 洛谷1177 作为模板题,时间复杂度为 O(n2)O(n^2)O(n2) 的算法只能过第一个测试点,时间复杂度为 O(nlog⁡n)O(n\log n)O(nlogn) 的算法可以通过所有测试点。 冒泡排序 每一轮两两之间相互比较,将更大者移至右方,则每一轮结束,当前最大的数一定被移到了最

Yucohny 450

排序算法(复习自用)

【代码】排序算法(复习自用)

Singularity_233的博客 5251
上一篇: 比较排序算法的简单复习(说明+代码)
下一篇: I LOVE YOU TOO密码解析
dingx
博客等级 码龄24年 67粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值