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

常见的排序算法

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

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

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日

相关文章

  • Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决

    针对“Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决”的问题,我们可以按照以下步骤进行解决: 1. 引入shiro-spring-boot-starter 在pom.xml中加入以下依赖配置 <dependency> <groupId>org.apache.shiro</gr…

    Java 2023年5月19日
    00
  • Mybatis中SqlSession下的四大对象之执行器(executor)

    Mybatis是一款流行的ORM框架,SqlSession是其核心组件之一。在SqlSession中,有四大对象分别是:Configuration、Executor、StatementHandler和ResultSetHandler。其中,Executor是Mybatis中最重要的对象之一,本文将详细讲解Mybatis中SqlSession下的四大对象之执行…

    Java 2023年5月20日
    00
  • 详解Java豆瓣电影爬虫——小爬虫成长记(附源码)

    标题:详解Java豆瓣电影爬虫——小爬虫成长记(附源码)攻略 介绍:本篇攻略是关于Java编写豆瓣电影爬虫的详细讲解,附带源代码。本文将帮助读者了解如何搭建基础环境、获取网页源代码、解析数据、存储数据等方面的知识点,以及具体如何编写豆瓣电影爬虫,如何运用Java开发一个个小而强大的爬虫。 搭建环境: 在开始写Java爬虫之前,你需要先安装Java SE Ru…

    Java 2023年5月20日
    00
  • Java输入数据的知识点整理

    Java输入数据的知识点整理 在Java编程中,输入数据是非常重要的一部分,如果没有正确的输入数据,程序很难执行下去。本文将详细介绍Java输入数据的知识点整理,包括以下内容: Java.util.Scanner类 标准输入流和标准输出流 System.console()方法 示例说明 Java.util.Scanner类 Scanner类为读取用户输入提供…

    Java 2023年5月26日
    00
  • Spring Security动态权限的实现方法详解

    Spring Security动态权限的实现方法详解 什么是动态权限? 在传统的企业应用中,权限被存储在静态的权限表中,着重强调的是用户拥有哪些权限。但是在现实生活中,我们会发现企业的角色是十分复杂的,拥有权限表面看起来是不够的。例如,对于一个CRM系统,管理员可能需要对某些用户进行一些特殊的操作。这种情况下,我们需要实现动态权限,即在运行时动态授权,而不是…

    Java 2023年5月20日
    00
  • springboot 动态数据源的实现方法(Mybatis+Druid)

    关于Spring Boot动态数据源的实现方法,我将介绍如何使用Mybatis和Druid实现,下面是详细步骤: 1. 引入相关依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</art…

    Java 2023年5月20日
    00
  • springboot整合多数据源配置方式

    对于“springboot整合多数据源配置方式的完整攻略”,我会逐步进行讲解。 1. 配置数据源 在项目中引入所需的依赖,例如: <!– JDBC驱动依赖,根据数据库不同而变化 –> <dependency> <groupId>com.mysql.jdbc</groupId> <artifactId&…

    Java 2023年5月20日
    00
  • SpringMVC结构简介及常用注解汇总

    以下是关于“SpringMVC结构简介及常用注解汇总”的完整攻略,其中包含两个示例。 SpringMVC结构简介 SpringMVC是一个基于MVC架构的Web框架,它提供了一种灵活、高效的方式来开发Web应用程序。在SpringMVC中,请求的处理流程可以分为以下几个步: 客户端发送请求到DispatcherServlet。 DispatcherServl…

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