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

常见的排序算法

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

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

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日

相关文章

  • 使用SpringBoot开发Restful服务实现增删改查功能

    下面我会详细讲解使用SpringBoot开发Restful服务实现增删改查功能的完整攻略。这个过程可以通过如下步骤实现: 1. 准备工作 在开始本次攻略之前,需要准备如下工具和环境:- JDK 1.8 或更高版本- Maven 3.0 或更高版本- SpringBoot 2.0 或更高版本 2. 创建一个SpringBoot项目 首先,我们需要用Maven创…

    Java 2023年5月15日
    00
  • Java编写多功能万年历程序的实例分享

    Java编写多功能万年历程序的实例分享 本攻略将介绍使用Java编写多功能万年历程序的完整过程。 1. 概述 本程序的功能包括: 显示公历日期、星期、农历日期、节气、节日等信息 支持查看指定日期的信息 支持查询指定日期范围内的某个节日的日期 支持查询指定日期范围内的某个节气的日期 支持循环显示节日或节气日期 2. 准备工作 为了编写这个程序,您需要掌握Jav…

    Java 2023年5月20日
    00
  • SSH框架网上商城项目第11战之查询和删除商品功能实现

    SSH框架网上商城项目第11战之查询和删除商品功能实现 本文将详细讲解如何在SSH框架中实现查询和删除商品的功能。在此之前,需要确保该项目中已经实现了商品的增加和修改功能。 查询商品 在实现查询商品的功能前,首先需要在商品管理页面中添加查询表单。在JSP页面中添加如下代码: <form class="form-inline" act…

    Java 2023年6月16日
    00
  • SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法

    Spring Boot提供了两种方式来实现定时任务:Spring Schedule和Quartz整合。下面是Spring Boot定时任务两种实现方法的详细攻略: 1. Spring Schedule实现定时任务 Spring Schedule是Spring Boot提供的一种轻量级的定时任务框架,可以非常方便地实现定时任务。以下是使用Spring Sche…

    Java 2023年5月14日
    00
  • Spring框架生成图片验证码实例

    让我来详细讲解一下“Spring框架生成图片验证码实例”的完整攻略。 1. 环境搭建 首先,我们需要搭建好Spring MVC环境,这里就不做过多的讲解了。如果你还不熟悉Spring MVC的环境搭建,可以先学习一下相关的教程,在此不再赘述。 2. 添加依赖 在我们项目的pom.xml文件中,我们需要添加以下依赖: <!– SpringSecurit…

    Java 2023年6月15日
    00
  • Springboot集成knife4j实现风格化API文档

    下面是“Springboot集成knife4j实现风格化API文档”的完整攻略: 简介 knife4j是为Java Spring项目提供的一款文档生产工具,可以便捷地生成API文档,并支持根据Swagger注解来生成对应的代码实现。knife4j还提供了自定义的UI界面,可以实现API文档的风格化展示。 在本攻略中,我们将介绍如何在Springboot项目中…

    Java 2023年5月19日
    00
  • Java连接 JDBC基础知识(操作数据库:增删改查)

    Java连接 JDBC基础知识(操作数据库:增删改查) 前言 在现代的 Web 开发中,数据库是一个非常重要的组成部分。而 Java 作为一种高度优秀的编程语言,有着丰富的数据库连接库和框架。其中,JDBC 就是 Java 数据库连接的一种基础技术,而其实现也是非常简单的。本文将介绍 JDBC 基础知识及其在操作数据库时的使用攻略。 JDBC 连接数据库 首…

    Java 2023年5月19日
    00
  • Sprint Boot @SpringBootApplication使用方法详解

    @SpringBootApplication是Spring Boot中的一个注解,它是一个组合注解,包含了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。在Spring Boot应用程序中,通常会使用@SpringBootApplication注解来标记主类,以启用自动配置和组件扫描。本文…

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