排序算法总结(Python、Java)

Title of Content

  • 1 冒泡排序 Bubble sort:两两交换,大的冒到最后
    • 概念
    • 排序可视化
    • 代码实现
      • Python - 基础实现
      • Python - 优化实现
      • Java - 优化实现
      • C - 优化实现
      • C++ - 优化实现
  • 2 选择排序 Selection sort:第i轮遍历时,将未排序序列中最小/大的数放到位置i。
    • 概念
    • 排序可视化
    • 代码实现
      • Python
      • Java
  • 3 插入排序 Insertion sort:每轮将未排序元素插入已排序序列
    • 概念
    • 排序可视化
    • 代码实现
      • Python
      • Java
  • Merge sort
  • Quick sort


1 冒泡排序 Bubble sort:两两交换,大的冒到最后

概念

解释:
compares adjacent items and swaps them if they are in the wrong order
每轮遍历后的效果:
最大/最小的元素到达数字末尾
口诀:
(对于一个升序序列)两两交换,大的冒到最后
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
优化实现: 当外层循环(对整个数组的一次遍历)的这一轮遍历时没有进行交换,意味着整个数组已经有序,迭代没有必要再进行。
在这里插入图片描述

排序可视化

https://www.hackerearth.com/practice/algorithms/sorting/bubble-sort/visualize/

代码实现

Python - 基础实现

def bubbleSort(intList, sort="asc"):"""对整数列表进行冒泡排序。:param intList: 需要排序的整数列表。:param sort: 排序方式,"asc" 表示升序(默认),"desc" 表示降序。如果提供了除 "asc" 或 "desc" 之外的 sort 参数,将默认采用升序排序。:return: None。函数直接对输入的列表进行排序,不返回任何值。"""n = len(intList)# 如果 sort 参数不是 "asc" 或 "desc",默认为升序if sort not in ["asc", "desc"]:sort = "asc"for i in range(n):# inner sort# n-i-1 外层每循环i次,得到i个最大值在末尾,因此这i个位置不用比,-1是因为防止j+1越界for j in range(n - i - 1):if (sort == "asc" and intList[j] > intList[j + 1]) or \(sort == "desc" and intList[j] < intList[j + 1]):temp = intList[j + 1]intList[j + 1] = intList[j]intList[j] = temp# 测试代码
sample_intList = [60, 10, 90, 50, 100, 80, 70, 30, 40, 20]
bubbleSort(sample_intList, "desc")
print(sample_intList)
bubbleSort(sample_intList, "asc")
print(sample_intList)

排序结果:
在这里插入图片描述

Python - 优化实现

增加判断这轮迭代有无进行元素交换的标记swapped

def bubbleSort(intList, sort="asc"):"""对整数列表进行冒泡排序。:param intList: 需要排序的整数列表。:param sort: 排序方式,"asc" 表示升序(默认),"desc" 表示降序。如果提供了除 "asc" 或 "desc" 之外的 sort 参数,将默认采用升序排序。:return: None。函数直接对输入的列表进行排序,不返回任何值。"""n = len(intList)# 如果 sort 参数不是 "asc" 或 "desc",默认为升序if sort not in ["asc", "desc"]:sort = "asc"for i in range(n):# inner sort# n-i-1 外层每循环i次,得到i个最大值在末尾,因此这i个位置不用比,-1是因为防止j+1越界for j in range(n - i - 1):swapped = False  # 这轮循环有无进行交换if (sort == "asc" and intList[j] > intList[j + 1]) or \(sort == "desc" and intList[j] < intList[j + 1]):intList[j], intList[j + 1] = intList[j + 1], intList[j]swapped = True# 如果刚刚那轮内层的遍历没有进行过交换,意味着数组已经有序,没有必要再进行后续的遍历if not swapped:break

Java - 优化实现

public class Sort {/*** 对整数数组进行冒泡排序。* * @param array 需要排序的整数数组。* @param sort 指定排序的类型,"asc" 表示升序,"desc" 表示降序。*             如果提供的 sort 参数不是 "asc" 或 "desc",将默认使用升序排序。*/public static void BubbleSort(int [] array, String sort){int n = array.length;if (!(sort.equals("asc")||sort.equals("desc"))){sort="asc";}for(int i=0;i<n;i++){boolean swapped=false;for (int j=0;j<n-i-1;j++){if((sort.equals("asc")&&array[j]>array[j+1])||(sort.equals("desc")&& array[j]<array[j+1])){swapped=true;int temp=array[j+1];array[j+1]=array[j];array[j]=temp;}}if (!swapped){break;}}}public static void main(String[] args) {int[] array={60, 10, 90, 50, 100, 80, 70, 30, 40, 20};BubbleSort(array, "asc");for(int i=0;i<array.length;i++){System.out.printf("%d ",array[i]);}System.out.println();BubbleSort(array, "desc");for(int i=0;i<array.length;i++){System.out.printf("%d ",array[i]);}System.out.println();}
}

C - 优化实现


C++ - 优化实现


2 选择排序 Selection sort:第i轮遍历时,将未排序序列中最小/大的数放到位置i。

概念

解释:
At each round i: find the minimum in {item i, item i+1, … } and swap it to the position i
每一轮迭代,找到一个最小的值,将它和这第i轮迭代对应的数组中位置i的原数字位置对调。

每轮遍历后的效果:
For each pass, we will move left to right looking for the next largest value. Once that is found, it will be swapped into its final position .

口诀:
第i轮遍历时,将未排序序列中最小/大的数放到位置i。
在这里插入图片描述
在这里插入图片描述
初始化时,选择数组中第一个值为最大值:
在这里插入图片描述

排序可视化

https://www.hackerearth.com/practice/algorithms/sorting/selection-sort/visualize/

代码实现

Python

def selectionSort(intList, sort="asc"):# 升序序列找的是最小值,降序序列找的是最大值if not (sort == "asc" or sort == "desc"):sort = "asc"for i in range(len(intList) - 1):# 每轮循环开始时,重置 min_or_max_i 为当前轮的起始位置min_or_max_i = i# 每一轮内层迭代的目的是找到带排序序列中最小/大值的下标j,并将它赋值给minItem_i记录下来for j in range(i + 1, len(intList)):if (sort == "asc" and intList[j] < intList[min_or_max_i]) or \(sort == "desc" and intList[j] > intList[min_or_max_i]):min_or_max_i = j# 找到带排序序列中的最小值后,将它赋值给数组的位置i,表示他是序列中第i小的元素# 这轮交换后得到的位置i,就是它的最终位置,因此外层循环只需要遍历len-1遍,前len-1个元素有序,整体有序if min_or_max_i != i:intList[i], intList[min_or_max_i] = intList[min_or_max_i], intList[i]

Java

3 插入排序 Insertion sort:每轮将未排序元素插入已排序序列

概念

解释:
它的工作原理是通过构建有序序列,对于未排序元素,在已排序序列中从后向前扫描,找到相应位置并插入。

每轮遍历后的效果:
At each round i: {item 0, item 1, …, item i} are sorted
得到一个从0-i的有序序列

口诀:
每轮将未排序元素插入已排序序列
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

排序可视化

https://www.hackerearth.com/practice/algorithms/sorting/insertion-sort/visualize/

代码实现

Python

def insertionSort(intList):# 外层循环每一轮迭代,i的位置指向的都是本轮未排序的元素for i in range(1, len(intList)):# 内存循环的每一轮迭代,从[0,i),是本轮已排序的序列# 目标就是将未排序元素,插入已排序序列j = iwhile j - 1 >= 0:  # 从小到大排序if intList[j] < intList[j - 1]:intList[j], intList[j - 1] = intList[j - 1], intList[j]j -= 1

Java

Merge sort

Quick sort

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/191832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

反序列化漏洞详解(一)

目录 一、php面向对象 二、类 2.1 类的定义 2.2 类的修饰符介绍 三、序列化 3.1 序列化的作用 3.2 序列化之后的表达方式/格式 ① 简单序列化 ② 数组序列化 ③ 对象序列化 ④ 私有修饰符序列化 ⑤ 保护修饰符序列化 ⑥ 成员属性调用对象 序列化 四、反序列化 …

unity学习笔记

一、线段渲染器 在Unity中&#xff0c;线段渲染器&#xff08;Line Renderer&#xff09;是一种用于在场景中绘制线段的组件。线段渲染器非常适合用于创建轨迹、路径、光束等效果。 1. 创建Line Renderer&#xff1a;在Unity编辑器中&#xff0c;你可以通过创建空对象 -> …

Linux - 动态库的加载 和 重谈进程地址空间 - vscode 当中的 Remote - SSH 插件

推书&#xff1a;《现代操作系统》《操作系统--精髓于设计原理》《UNIX环境高级编程》 目录 前言 程序的加载 程序没有加载之前的地址&#xff08;此时还是程序&#xff09; 程序被加载到内存之后&#xff08;此时是进程&#xff09; 动态库的地址 静态库的不加载&#xff…

数据结构——堆排序的topk问题

呀哈喽&#xff0c;我是结衣 前言 今天给大家带来的堆排序的topk问题。topk就是在许多数中&#xff0c;找出前k个大的数&#xff0c;可能是几十个数&#xff0c;也可能是几千万个数中找。今天我们将要在1000000&#xff08;一百万&#xff09;个数中找出前10大的数。 知识点 C…

【c】角谷猜想

#include<stdio.h> int coll(int x)//定义函数 {int count0;while(x>1){if(x%20){xx/2;count;}else{x3*x1;count;}}return count; } int main() {int n,num;scanf("%d",&n);int arr[n1];for(int i1;i<n;i)//输入n组数据保存到数组中{scanf("%d&…

数据结构之哈希表

数据结构之哈希表 文章目录 数据结构之哈希表一、哈希概念二、哈希冲突三、哈希函数常见哈希函数 四、哈希冲突解决闭散列闭散列的思考线性探测线性探测的实现 二次探测 开散列开散列概念开散列的思考开散列实现 五、开散列与闭散列比较 一、哈希概念 顺序结构以及平衡树中&am…

MidJourney笔记(6)-Niji模式

Niji模式 回顾一下,在讲解settings命令时,我们可以看到一个Niji字眼。 而且是在Midjourney V4之后才有的,那Niji到底是什么? Niji是MidJourney中用于绘制二次元/动漫风格的模型,那Niji的V4和V5有什么区别呢?

竞赛选题 : 题目:基于深度学习的水果识别 设计 开题 技术

1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/pos…

编程实战:类C语法的编译型脚本解释器(系列)

“脚本”始终是个具有独特魅力的领域&#xff0c;能够随时方便地解决一些问题&#xff0c;但脚本的随意性同时带来别的问题&#xff0c;所以脚本始终属于让人又爱又恨的存在。 很多大型系统都会嵌入一些小型的解释器&#xff0c;用来让用户亲自编写简单的逻辑规则。不幸的是&am…

springCache——jetcache缓存

文章目录 jetcache远程、本地缓存方案jetcache方法注解使用方式 jetcache远程、本地缓存方案 <dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId><version>2.6.4</version></de…

[c]比较月亮大小

本题的难点就是分情况讨论 #include<stdio.h> int main() {int n;scanf("%d",&n);int arr2[n];int p;for(int m0;m<n-1;m){scanf("%d",&arr2[m]);//输入n个数保存到数组}if(n1)//当输入一个数据时&#xff0c;输入0&#xff0c;可以判断…

Java中实现HTTPS连接的最佳实践

引言 大家好&#xff01;我是小黑。今天咱们来聊聊一个既热门又实用的话题&#xff1a;在Java中如何实现HTTPS连接。现在的网络世界&#xff0c;安全性是大家都非常关注的问题&#xff0c;特别是对于咱们这些程序员来说&#xff0c;更是如此。想想看&#xff0c;如果你的网站或…

【Java 基础】16 泛型

文章目录 什么是泛型&#xff1f;泛型的声明泛型的使用泛型方法通配符和泛型上下界1&#xff09;通配符2&#xff09;泛型上下界 泛型的好处注意事项 泛型提供了一种在编写代码时更好地 支持类型安全的机制。通过泛型&#xff0c;我们可以编写更加 通用、 灵活、 可读性高的…

docker 搭建开发环境,解决deepin依赖问题

本机环境&#xff1a; deepin v23b2 删除docker旧包 sudo apt-get remove docker docker-engine docker.io containerd runc注意卸载docker旧包的时候Images, containers, volumes, 和networks 都保存在 /var/lib/docker 卸载的时候不会自动删除这块数据&#xff0c;如果你先…

Python爬虫完整代码模版——获取网页数据的艺术

Python爬虫完整代码模版——获取网页数据的艺术 在当今数字化世界中&#xff0c;数据是价值的源泉。如何从海量数据中提取所需信息&#xff0c;是每个数据科学家和开发者必须面对的问题。Python爬虫作为一种自动化工具&#xff0c;专门用于从网站上抓取数据。本文将提供一个Py…

YOLOv7+姿态估计Pose+tensort部署加速

YOLOv7-Pose 实现YOLOv7&#xff1a;可训练的免费套件为实时目标检测设置了最新技术标准 YOLOv7-Pose的姿态估计是基于YOLO-Pose的。关键点标签采用MS COCO 2017数据集。 训练 使用预训练模型yolov7-w6-person.pt进行训练。训练命令如下&#xff1a; python -m torch.distr…

Redis 安装

文章目录 第1关&#xff1a;Redis 安装第2关&#xff1a; Redis 启动 第1关&#xff1a;Redis 安装 编程要求 在右侧命令行中在线安装 Redis 服务器软件和客户端软件&#xff1a; 在线安装 Redis&#xff08;实验环境使用的是 Ubuntu 系统&#xff09;&#xff1b; 测试说明…

iptables——建立linux安全体系

目录 一. 安全技术类型 二. linux防火墙 1. 按保护范围划分&#xff1a; 2. 按实现方式划分&#xff1a; 3. 按网络协议划分&#xff1a; 4. 防火墙原理 三. 防火墙工具——iptables 1. netfilter 中五个勾子函数和报文流向 数据包传输过程&#xff1a; ① .五表四链…

OOM了?物理内存不够了?试试这个方法来提升内存容量,不花钱的

通过增加虚拟内存来提高内存使用 本文解决的实际问题&#xff1a; 当我们物理内存小的时候&#xff0c;会出现OOM&#xff0c;然后服务自动死掉的情况。因为物理内存大小是固定的&#xff0c;有没有其他好的办法来解决呢&#xff1f;这里我们可以适当调整Linux的虚拟内存来协作…

更改Jupyter Notebook 默认存储路径

import osprint(os.path.abspath(.)) 然后打开cmd,输入&#xff1a; jupyter notebook --generate-config 按照路径在本地文件夹中找到那个文件。 然后找到"c.NotebookApp.notebook_dir"这条语句&#xff1a;&#xff08;直接通过"crtlf"输入关键字找阿 …