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

  • Post category: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[j+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 merge_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[largest] < 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[0], 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)

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.174952316284
选择排序时间: 1.880000114440918
插入排序时间: 0.0030002593994140625
希尔排序时间: 0.0030002593994140625
归并排序时间: 0.031000137329101562
快速排序时间: 0.0030002593994140625
堆排序时间: 0.015000104904174805
计数排序时间: 0.002000093460083008

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

示例说明

示例1

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

示例2

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