排序算法总结(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,一经查实,立即删除!

相关文章

华为OD机试 - CPU算力分配(Java JS Python C)

题目描述 现有两组服务器A和B,每组有多个算力不同的CPU,其中 A[i] 是 A 组第 i 个CPU的运算能力,B[i] 是 B组 第 i 个CPU的运算能力。 一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换, 求两组服务器中,用于…

反序列化漏洞详解(一)

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

【笔记】常用的Linux命令之解压缩:tar、zip、rar 命令

1、tar 常用压缩和解压缩 # 压缩文件 file1 和目录 dir2 到 test.tar.gz tar -zcvf test.tar.gz file1 dir2 # 解压 test.tar.gz&#xff08;将 c 换成 x 即可&#xff09; tar -zxvf test.tar.gz 额外知识&#xff1a;查看压缩文件内容 # 列出压缩文件的内容 tar -ztvf test…

unity学习笔记

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

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

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

力扣labuladong一刷day24天

力扣labuladong一刷day24天 文章目录 力扣labuladong一刷day24天一、875. 爱吃香蕉的珂珂二、1011. 在 D 天内送达包裹的能力三、410. 分割数组的最大值 一、875. 爱吃香蕉的珂珂 题目链接&#xff1a;https://leetcode.cn/problems/koko-eating-bananas/?utm_sourceLCUS&…

数据结构——堆排序的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…

为获取导入百分比,使用easyexcel获取导入excel表总行数

背景 分批读取大量数据的excel文件&#xff0c;每次读取1000行数据&#xff0c;然后插入数据库&#xff0c;并且去执行一个方法&#xff0c;执行完毕后更新此行数据的状态。需要获取已更新数据的占比&#xff0c;即计算百分比。 因为是分批读取的&#xff0c;我们不可以直接用已…

CPP-SCNUOJ-Problem P26. [算法课动态规划] 打家劫舍

Problem P26. [算法课动态规划] 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动…

LeetCode每日一题 | LeetCode-1094.拼车

LeetCode-1094.拼车 题目描述问题分析程序代码 题目描述 原题链接 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trip[i] [numPassengersi, fromi, toi] 表…

14.Oracle中RegExp_Like 正则表达式基本用法

--基本用法&#xff0c;是否包含某字符串 like %36% select * from k_micfo where regexp_like(loginid,36);if regexp_like(str,^[0-9\.]$) --只包含数字0-9&#xff0c;,小数点.--oracle判断字段是否是纯数字 (四种写法结果一样&#xff09; select * from k_micfo where r…

SpringCloudAlibaba整合Gateway实现网关

目录 一、概念 二、整合Gateway实现网关 三、Gateway实现转发 四、Gateway实现请求过滤 一、概念 Gateway是一种基于SpringC

第十节HarmonyOS 使用资源引用类型

Resource是资源引用类型&#xff0c;用于设置组件属性的值。推荐大家优先使用Resource类型&#xff0c;将资源文件&#xff08;字符串、图片、音频等&#xff09;统一存放于resources目录下&#xff0c;便于开发者统一维护。同时系统可以根据当前配置加载合适的资源&#xff0c…

paddle 语谱图对比

paddle 语谱图对比 代码代码解析结论代码 import paddle from paddleaudio import load from paddleaudio.features import LogMelSpectrogram,MFCC,Spectrogram,MelSpectrogramfrom matplotlib import pyplot as pltdata, sr = load

MidJourney笔记(6)-Niji模式

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

简单理解算法

简单理解算法 前言算法衡量一个好的算法具备的标准算法的应用场景 数据结构数据结构的组成方式 前言 hello&#xff0c;宝宝们~来分享我从一本书中理解的算法。《漫画算法》感觉对我这种算法小白比较友好。看完感觉对算法有了新的理解&#xff0c;计算机学习这么多年&#xff…

H265、VP9、AV1视频编码器性能对比

1、背景介绍 目前在视频编解码器中,H264 已经成为绝对的主流,被大部分设备、浏览器所支持。虽然有更先进的编码器推出,但是受限于推广速度和设备支持成本,一直未能成为主流。 今年公司的目标是持续降本增效,现在将”屠刀“指向了视频业务的存储成本。视频文件存储主要两…

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

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