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的已排序数组,需要对其进行排序。可以使用上述代码对八大排序算法的速度进行实例对比,以选择最适合的排序算法。在这种情况下,插入排序的速度最快,因为它可以利用已排序的部分,减少比较和交换的次数。