前言冒泡排序快速排序插入排序希尔排序选择排序堆排序归并排序计数排序桶排序基数排序
00
前言
本章介绍使用Python实现场景的几种排序算法。分别有冒泡算法、快速排序、插入排序、希尔排序、选择排序、堆排序、归并排序、计数排序、桶排序、基数排序。
创建一个比较大的list,用于测试排序算法使用。
import numpy as np
import time
src_list = np.random.randint(1, 100000, (50000)).tolist()
01
冒泡排序
冒泡排序是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
def bubble_sort(arr):
n = len(arr)
for i in range(n-1):
for j in range(0, n-1-i):
if arr[j] > arr[j+1] :
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
start = time.time()
result = bubble_sort(src_list)
end = time.time()
print ("耗时:%d 毫秒" % int(round((end - start) * 1000)))
耗时:197286 毫秒
02
快速排序
在一个数据集中取个数作为参考点,大于该数的元素放在其右边;小于该数的元素放在其左边。这样就将数据集分成两部分,大于参考值部分和小于参考值部分,递归该过程,直到序列中所有记录均有序。
def quick_sort(listt, left, right):
if left >= right:
return listt
# 选择参考点,该调整范围的第1个值
pivot = listt[left]
low = left
high = right
while left # 从右边开始查找大于参考点的值
while left and listt[right] >= pivot:
right -= 1
# 这个位置的值先挪到左边
listt[left] = listt[right]
# 从左边开始查找小于参考点的值
while left and listt[left] <= pivot:
left += 1
# 这个位置的值先挪到右边
listt[right] = listt[left]
# 写回改成的值
listt[left] = pivot
# 递归,并返回结果
quick_sort(listt, low, left - 1) # 递归左边部分
quick_sort(listt, left + 1, high) # 递归右边部分
return listt
start = time.time()
result = quick_sort(src_list, 0, 1000)
end = time.time()
print ("耗时:%d 毫秒" % i