常见的排序算法,一篇就够了

常见的排序算法

排序算法是计算机程序中常见的基本操作之一,它的作用是将一组无序的数据按照某种规则进行排序。在实际的开发中,经常需要对数据进行排序,比如搜索引擎中对搜索结果的排序、电商网站中对商品的排序等。

目前常见的排序算法有多种,下面将对一些常见的排序算法进行介绍:

1. 冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数据,每次比较相邻的两个元素,如果顺序错误就交换它们。重复多次,直到所有的数据按照规定顺序排列。

以下是冒泡排序算法的实现过程:

def bubble_sort(arr):
    size = len(arr)
    for i in range(size - 1):
        for j in range(size - i - 1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

冒泡排序的时间复杂度为 O(n^2),并且它的空间复杂度为 O(1)。

2. 快速排序

快速排序是一种常用的排序算法,它采用分治的思想来解决问题。它的基本思想是选择一个值作为基准值,将数据分为两个部分,比基准值小的放在左边,比基准值大的放在右边,然后对左右两部分递归地进行快排。

以下是快速排序算法的实现过程:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left, right, mid = [], [], []
    for x in arr:
        if x < pivot:
            left.append(x)
        elif x > pivot:
            right.append(x)
        else:
            mid.append(x)
    return quick_sort(left) + mid + quick_sort(right)

快速排序的时间复杂度为 O(nlogn),但在最坏情况下,时间复杂度会变为 O(n^2)。

3. 插入排序

插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对未排序的数据在已排序序列中从后向前扫描,找到相应位置插入。

以下是插入排序算法的实现过程:

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and arr[j] > key:
            arr[j+1] = arr[j]
            j -= 1
        arr[j+1] = key
    return arr

插入排序的时间复杂度为 O(n^2),并且它的空间复杂度为 O(1)。

4. 堆排序

堆排序是一种树形选择排序,它是利用堆这种数据结构设计的排序算法,它的实现过程是先将无序序列构造成一个最大堆,找出最大值放在序列的起始位置,然后再将剩余元素重新构造成一个最大堆,重复进行该操作,直到整个序列有序为止。

以下是堆排序算法的实现过程:

def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2
    if l < n and arr[l] > arr[largest]:
        largest = l
    if r < n and arr[r] > arr[largest]:
        largest = r
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)
    for i in range(n, -1, -1):
        heapify(arr, n, i)
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)
    return arr

堆排序的时间复杂度为 O(nlogn),它的空间复杂度为 O(1)。

总结

不同的排序算法有各自的优缺点,选择合适的排序算法可以提高程序的效率,同时也能在一定程度上提高程序的可读性和可维护性。在实际开发中,应根据具体的需求选择合适的排序算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:常见的排序算法,一篇就够了 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 研究桃源留言本的漏洞

    研究桃源留言本的漏洞攻略: 一、介绍桃源留言本 桃源留言本是一个用PHP编写的简单留言板程序,原作者为huhuweb。该程序具有易用性、易修改的特点,因此可以广泛应用于小型网站的留言功能。不过,由于其代码较为简单,程序存在多处安全漏洞,需要加强安全设置。 二、审计桃源留言本 针对桃源留言本的漏洞进行审计,可抓取请求包,利用工具进行源代码分析、SQL注入等一系…

    Java 2023年6月16日
    00
  • MyBatis与Hibernate的比较

    下面是详细讲解“MyBatis与Hibernate的比较”的完整攻略。 概述 MyBatis和Hibernate都是Java语言中比较常用的ORM框架。 MyBatis和Hibernate的实现方式有所不同,对于不同场景和需求来说,它们各有优缺点。 对比MyBatis和Hibernate,能够帮助我们更好地选择合适的ORM框架。 MyBatis和Hibern…

    Java 2023年5月20日
    00
  • 详解JAVA中接口的定义和接口的实现

    关于JAVA中接口的定义和实现,我可以提供如下的完整攻略。 什么是接口? 在JAVA中,接口是一组未经实现的方法的集合。接口只定义方法名称,参数和返回类型,而不包含方法体。所以,一个接口不能被直接实例化,需要一个实现类来实现接口的方法。 接口的定义 接口使用interface关键字来定义。下面是一个简单的接口的定义。 public interface MyI…

    Java 2023年5月18日
    00
  • 一次 Java 服务性能优化实例详解

    一次 Java 服务性能优化实例详解 背景 某公司的 Java 服务在高并发情况下出现了性能问题,经常会出现请求响应时间过长的情况,导致用户体验下降。为了解决这个问题,我们进行了一次性能优化。 分析 定位问题 首先,我们需要定位问题所在。可以通过一些工具来进行性能分析,比如 JVM 自带的工具 jstack、jmap,以及开源的工具如 jProfiler,V…

    Java 2023年6月15日
    00
  • SpringSecurity注销设置的方法

    下面是关于SpringSecurity注销设置的方法的完整攻略: 1. 设置注销页面 首先,我们需要在SpringSecurity配置中指定注销页面的URL。我们可以在XML配置文件中加入以下配置: <http> <!–省略其他配置–> <logout logout-url="/logout" logou…

    Java 2023年5月20日
    00
  • java多线程实现取款小程序

    下面是针对Java多线程实现取款小程序的完整攻略。 准备工作 在开始之前,我们需要先了解一些Java多线程方面的基础知识,如线程创建与启动、线程同步、线程通信等。这些知识我们可以通过阅读相关的书籍或者在线教程来学习掌握。 实现步骤 创建一个银行账户类,包括账户余额、账户号码等属性,以及存、取款等方法。 public class Account { priva…

    Java 2023年5月18日
    00
  • 通过Spring Shell 开发 Java 命令行应用

    通过Spring Shell开发Java命令行应用,可以帮助我们方便地搭建一个强大的命令行应用程序,可以实现命令解析、命令补全等功能。下面是通过Spring Shell开发Java命令行应用的完整攻略: 1. 添加依赖 首先,我们需要在pom.xml中添加必要的依赖,这些依赖包含Spring Shell框架、Spring Boot框架和其他相关依赖: &lt…

    Java 2023年6月2日
    00
  • java实现ATM机系统(2.0版)

    Java实现ATM机系统(2.0版)攻略 1. 简介 本文主要介绍如何使用Java语言实现ATM机系统。ATM机系统是现代银行业务基础设施之一,而Java是一门优秀的编程语言,因此使用Java实现ATM机系统具有重要的现实意义和学习价值。 2. 功能需求 ATM机系统需要实现以下功能: 取款 存款 查询余额 修改密码 退出系统 3. 系统架构 ATM机系统的…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部