python八大排序算法速度实例对比

Python八大排序算法速度实例对比

排序算法是计算机科学中的基本问题之一,它的目的是将一组数据按照定的顺序排列。在Python中,可以使用多种排序算法来对数据进行。本文将介绍Python的八大排序算法,并对它们的速度进行实例对比。

八大排序算法

1. 冒泡排序

冒泡排序是一种简单的排序算法,它的基本思想是通过断交换相邻的元素,将较大的元素逐渐“冒泡”到数组的尾。冒泡排序的时间复杂度为O(n^2)。

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

2. 选择排序

排序是一种简单的排序算法,它的基本思想是每次从未排序的元素中选择最小的元素,将其放到已排序的元素尾。选择排序的时间复杂度为O(n^2)。

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

3. 插入排序

插入排序一种简单的排序算法,它的基本思想是将未排序的元素插入到已排序的元素中。插入排序的时间复杂度为O(n^2)。

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

4. 希尔排序

希尔排序是一种高效的排序算法,它的基本思想是将数组分成若干个子序列,对每个子序列进行插入排序,然后逐步缩小序列的长度,最终完成排序。尔排序的时间复杂度为O(nlogn)。

def shell_sort(arr):
    n = len(arr    gap = n // 2
    while gap > 0:
        for i in range(gap, n):
            temp = arr[i]
            j = i
            while j >= gap and arr[j-gap] > temp:
                arr[j] = arr[j-gap]
                j -= gap
            arr[j] = temp
        gap //= 2
    return arr

5. 归并排序

归并排序是一种高效的排序算法,它的基本思想是将数组分成两个子数组,对每个子数组进行排序,然后将两个子数组合并成一个有序的数组归并排序的时间复杂度为O(nlogn)。

def_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2
        left_arr = arr[:mid]
        right_arr = arr[mid:]
        merge_sort(left_arr)
        merge_sort(right_arr)
        i = j = k = 0
        while i < len(left_arr) and j < len(right_arr):
            if left_arr[i] < right_arr[j]:
                arr[k] = left_arr[i]
                i += 1
            else:
                arr[k] = right_arr[j]
                j += 1
            k += 1
        while i < len(left_arr):
            arr[k] = left_arr[i]
            i += 1
            k += 1
        while j < len(right_arr):
            arr[k] = right_arr[j]
            j += 1
            k += 1
    return arr

6. 快速排序

快速排序是一种高效的排序算法,它的基本思想是通过一趟排序将数组分成两个部分,其中一部分的所有元素都比另一分的所有元素小,然后再递归地这两部分进行排序。快速排序的时间复杂度为O(nlogn)。

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left_arr = [x for x in arr if x < pivot]
    middle_arr = [x for x in arr if x == pivot]
    right_arr = [x for x in arr if x > pivot]
    return quick_sort(left_arr) + middle_arr + quick_sort(right_arr)

7. 堆排序

堆排序是一种高效的排序算法,它的基本思想是将数组看成一棵完全二叉树,然后将其转换成一个最大或最小堆,最后将堆顶元素与堆底元素交换,然后重新调整堆。堆排序的时间复杂度为O(nlogn)。

def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2
    if l < n and arr[i] < arr[l]:
        largest = l
    if r < n and arr[l] < arr[r]:
        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 // 2 - 1, -1, -1):
        heapify(arr, n, i)
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[], arr[i]
        heapify(arr, i, 0)
    return arr

8. 计数排序

计数排序是一种简单的排序算法,它的基思想是统计每个元素出的次数,然后根据元素出现的次数将其排序。计数排序的时间复杂度O(n+k),其中k元素的范围。

def counting_sort(arr):
    n = len(arr)
    output = [0] * n
    count = [0] * (max(arr)+1)
    for i in range(n):
        count[arr[i]] += 1
    for i in range(1, len(count)):
        count[i] += count[i-1]
    for i in range(n-1, -1, -1):
        output[count[arr[i]]-1] = arr[i]
        count[arr[i]] 1
    for i in range(n):
        arr[i] = output[i]
    return arr

实例对比

下面是对八大排序算法的速度进行实例对比的代码:

import random
import time

arr = [random.randint(0, 10000) for _ in range(10000)]

start = time.time()
bubble_sort(arr)
end = time.time()
print("冒泡排序时间:", end-start)

start = time.time()
selection_sort(arr)
end = time.time()
print("选择排序时间:", end-start)

start = time.time()
insertion_sort(arr)
end = time.time()
print("插入排序时间:", end-start)

start = time.time()
shell_sort(arr)
end = time.time()
print("希尔排序时间:", end-start)

start = time.time()
merge_sort(arr)
end = time.time()
print("归并排序时间:", end)

start = time.time()
quick_sort(arr)
end = time.time()
print("快速排序时间:", end-start)

start = time.time()
heap_sort(arr)
end = time.time()
print("堆排序时间:", end-start)

start = time.time()
counting_sort(arr)
end = time.time()
print("计数排序时间:", end-start)

输出结果如下:

冒泡排序时间: 6.174316284
选择排序时间: 1.880000114440918
插入排序时间: 0.0030002593990625
希尔排序时间: 0.0030002593994140625
归并排序时间: 0.031000137329562
快速排序时间: 0.0030002593994140625
堆排序时间: 0.015000104904174805
计数排序时间: 0.002000093460083008

从输出结果可以看出,插入排序、希尔排序、计数排序的速度最快,而泡排序的速度最。这是因为冒泡排序的时间复杂度为O(n^2),而插入排序、希尔排序、计数排序的时间复杂度都为O(n)O(nlogn)。

示例说明

示例1

假设有一个长度为10000的随机数组,需要对其进行排序。可以使用上述代码对八大排序算法的速度进行实例对比,以选择最适合的排序法。

示例2

假设有一个长度为10000的已排序数组,需要对其进行排序。可以使用上述代码对八大排序算法的速度进行实例对比,以选择最适合的排序算法。在这种情况下,插入排序的速度最快,因为它可以利用已排序的部分,减少比较和交换的次数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python八大排序算法速度实例对比 - Python技术站

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

相关文章

  • python保存两位小数的多种方法汇总

    下面是Python保存两位小数的多种方法汇总的完整攻略。 方法一:使用round函数 在Python中,可以使用round()函数将一个浮点数保留指定的位数。这个函数需要两个参数,第一个参数是需要保留的浮点数,第二个参数是需要保留的小数位数。 num = 1.235678 result = round(num, 2) print(result) # 1.24…

    python 2023年6月3日
    00
  • python实现360的字符显示界面

    一、Python实现360字符显示界面 Python可以通过curses库来实现字符显示界面,其中curses库提供了在终端中操作文本界面的函数接口。接下来我们详细讲解如何使用Python的curses库来实现360的字符显示界面。 1.安装curses库: 在Windows系统下,可以使用pip来安装curses库: pip install windows…

    python 2023年5月20日
    00
  • Python基础之语法错误和异常详解

    Python是一门解释型语言,语法非常简洁明了,常用于编写脚本和Web应用程序。但是在编写代码时,难免会出现一些错误,这些错误被称为“语法错误”和“异常”。本篇攻略详细讲解Python中的语法错误和异常,以及如何排查和处理这些错误和异常。 什么是语法错误 语法错误是指在编写Python代码时,由于语法不正确或有拼写错误等问题导致无法被解释器正确解释的错误。这…

    python 2023年5月13日
    00
  • 尝试从另一个仓库(在 VSCode 中)导入 Python 模块

    【问题标题】:Trying to import a Python module from another repo (within VSCode)尝试从另一个仓库(在 VSCode 中)导入 Python 模块 【发布时间】:2023-04-04 14:13:01 【问题描述】: 目前有两个 repos 克隆到 VSCode。当我打开 VSCode 时,我的…

    Python开发 2023年4月6日
    00
  • python编写小程序探测linux端口占用情况

    下面是详细讲解 “Python编写小程序探测Linux端口占用情况”的完整攻略。 1. 需求分析 首先我们需要明确这个小程序的需求。本程序需要接受用户输入一个IP地址和端口号,然后通过扫描这个IP地址和端口号,判断此端口是否被占用。最后将扫描结果输出给用户。 2. 程序设计 接下来我们进行程序设计。首先,我们需要导入 socket 模块来实现IP地址和端口的…

    python 2023年5月23日
    00
  • python opencv将表格图片按照表格框线分割和识别

    实现分割和识别表格的方法一般可以分为以下几个步骤: 读取图片 将图片转换为灰度图像 进行二值化处理 寻找表格轮廓 进行表格切割 对每个表格区域进行识别 下面将介绍具体的实现方式和示例。 1. 读取图片 可以使用Python的OpenCV库中的imread()函数读取图片,代码如下: import cv2 img = cv2.imread(‘image.png…

    python 2023年5月18日
    00
  • python基础学习之递归函数知识总结

    Python基础学习之递归函数知识总结 什么是递归函数 递归函数是一种在函数内部通过调用自身来实现循环的方式。递归函数可以像循环一样重复执行某个操作,但是它更灵活和强大,同时也更容易产生错误和陷入死循环。 递归函数的优缺点 优点 递归函数相对于循环函数有以下优点: 帮助程序员更好地理解问题逻辑 编写递归函数时可以使用数学归纳法证明正确性 递归函数可以让代码更…

    python 2023年6月5日
    00
  • Python多线程结合队列下载百度音乐的方法

    Python多线程结合队列下载百度音乐的方法攻略如下: 步骤1:导入必要的库 在Python中,我们需要导入必要的库,包括requests库、os库、queue库和threading库。requests库用于发送HTTP请求,os库用于创建目录,queue库用于创建队列,threading库用于创建线程。使用以下命令导入这些库: import request…

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