排序算法总结(Python、Java)

news2025/1/28 1:18:57

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 = i
        while 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.coloradmin.cn/o/1279138.html

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

相关文章

nodejs微信小程序+python+PHP贵州旅游系统的设计与实现-计算机毕业设计推荐MySQL

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

2022年8月2日 Go生态洞察:Go 1.19版本发布深度解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

buuctf [极客大挑战 2019]Havefun1

解题思路&#xff1a; 小习惯 本题先看看源码或者检查一下&#xff0c;可能这是俺的一个小习惯。 源码里面都看到了php的代码 php代码解析&#xff1a; $cat$_GET[cat]; echo $cat; if($catdog){ echo Syc{cat_cat_cat_cat}; } 1.$ca…

vue3-vite-ts:编写Rollup插件并使用 / 优化构建过程

一、vue3-vite-ts项目&#xff0c;编写Rollup插件并使用的意义 在使用Vue3 Vite TypeScript这种技术栈时&#xff0c;可以使用Rollup插件来优化构建过程&#xff0c;例如使用rollup-plugin-typescript2插件来编译TypeScript代码&#xff0c;使用rollup-plugin-vue插件来处理…

C指针介绍(1)

文章目录 每日一言指针的简单介绍内存和地址指针在内存中的存储指针的定义和声明泛型指针 指针的关系运算算数运算关系运算 结语 每日一言 ⭐「 一声梧叶一声秋&#xff0c;一点芭蕉一点愁&#xff0c;三更归梦三更后。 」–水仙子夜雨-徐再思 指针的简单介绍 C语言指针是C语…

半监督节点分类上的HyperGCN

1.Title HyperGCN: Hypergraph Convolutional Networks for Semi-Supervised Classification&#xff08;Naganand Yadati、Prateek Yadav、Madhav Nimishakavi、Anand Louis、Partha Talukdar&#xff09;【ACM Transactions on Knowledge Discovery from Data 2022】 2.Conc…

SimpleDataFormat 非线程安全

目录 前言 正文 1.出现异常 2.解决方法1 3.解决方法2 总结 前言 SimpleDateFormat 类是 Java 中处理日期和时间格式化和解析的类&#xff0c;但它并不是线程安全的。这意味着多个线程不能安全地共享一个 SimpleDateFormat 实例进行日期和时间的解析和格式化。当多个…

第二次量子化

专栏目录: 高质量文章导航-持续更新中 前置复盘: 玻色子和费米子: 首先,我们希望把描述单粒子态的量子力学推广到全同多粒子体系。我们的做法是从单粒子态的希尔伯特空间(Hilbert Space)出发,构造全同多粒子态的态空间——福克空间(Fock Space),它实际上就是无穷个…

nodejs微信小程序+python+PHP药品招标采购系统的设计与实现-计算机毕业设计推荐MySQL

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

制作一个RISC-V的操作系统一-计算机系统漫游

文章目录 计算机的硬件组成两种架构程序的存储与执行程序语言的设计和进化一个mini计算机 编程语言的进化存储设备的层次结构操作系统 计算机的硬件组成 所有硬件由总线连接起来 两种架构 总线个数不同&#xff0c;Memory储存内容不同 程序的存储与执行 首先编译和链接某…

测试面经1130

深信服软件测试实习生面经 1. 自我介绍2. 深入的聊一下软件测试岗位主要是干什么的&#xff1f;是一个怎样的工作&#xff1f;他的职责定位&#xff1f;软件测试需要哪些知识技能&#xff08;软件测试是做什么的&#xff1f;&#xff09;3. 如果开发了一个系统&#xff0c;没有…

计算机毕业设计 基于Web的铁路订票管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

解读Java虚拟机垃圾回收器:探究经典算法背后的奥秘

目录 一、GC分类与性能指标 &#xff08;一&#xff09;垃圾回收器分类 &#xff08;二&#xff09;性能指标 &#xff08;三&#xff09;不可能三角 二、不同的垃圾回收器概述 三、Serial回收器&#xff1a;串行回收 四、ParNew回收器&#xff1a;并行回收 五、Parall…

可视化数据库管理客户端:Adminer

简介&#xff1a;Adminer&#xff08;前身为phpMinAdmin&#xff09;是一个用PHP编写的功能齐全的数据库管理工具。与phpMyAdmin相反&#xff0c;它由一个可以部署到目标服务器的文件组成。Adminer可用于MySQL、PostgreSQL、SQLite、MS SQL、Oracle、Firebird、SimpleDB、Elast…

水果编曲软件fl studio手机版下载

fl studio mobile手机版中文名水果编曲软件&#xff0c;它是一款非常不错的音乐编曲软件&#xff0c;凭借简单易上手的操作方式&#xff0c;强悍且实用的功能&#xff0c;深受到了音乐创作者的喜爱&#xff0c;不仅仅提供了广阔的音乐创作空间&#xff0c;可以让用户对舞曲、轻…

巧用MACD精准抄底和逃顶

一、认识MACD MACD又称平滑异同移动平均线&#xff0c;是由美国投资家杰拉尔德阿佩尔在 20 世纪 70 年代末提出的。 MACD 指标的设计基于MA均线原理&#xff0c;是对收盘价进行平滑处理&#xff08;求出加权平均值&#xff09;后的一种趋向类指标。它是股票交易中一种常见的技术…

CGAL的三维曲面细分方法

1、介绍 细分方法是从任意多边形网格生成平滑曲面的简单而强大的方法。与基于样条曲面的方法&#xff08;如NURBS&#xff09;或其他基于数字的建模技术不同&#xff0c;细分方法的使用者不需要掌握细分方法的数学知识。几何的直观性足以控制细分方法。 Subdivision_method_3适…

【U8+】用友U8删除固定资产卡片,提示:当前卡片不是本月录入的卡片,不能删除。

【问题描述】 用友U8软件&#xff0c;参照已有账套新建账套的时候&#xff0c;选择结转期初余额。 例如&#xff1a;参照已有账套的2022年新建2023年的账套。 结转期初的时候勾选了固定资产模块&#xff0c; 建立成功后登录23年新的账套后&#xff0c;删除固定资产卡片&#xf…

CSS 滚动捕获 scroll-margin

CSS滚动捕获 scroll-margin 非滚动捕获容器语法兼容性 CSS滚动捕获 scroll-margin 设置元素的滚动外边距 非滚动捕获容器 之前在 scroll-padding 中说过如何用 scroll-padding 避免锚点定位时元素贴着容器边缘的问题, 现在我们尝试用 scroll-margin 解决 <body><ma…

electerm下载和安装

electerm下载和安装 一、概述 electerm 是一款免费开源、基于electron/ssh2/node-pty/xterm/antd/ subx等libs的终端/ssh/sftp客户端(linux, mac, win)。 而且个人觉得electerm界面更好看一些&#xff0c;操作都是类似的。 二、下载安装 下载地址&#xff1a;https://elec…