1. 冒泡排序
Python 实现:
import time
import random
def bubbleSort(alist):
for i in range(len(alist)):
for j in range(len(alist)-1, i, -1):
if alist[j] < alist[j-1]:
temp = alist[j]
alist[j] = alist[j-1]
alist[j-1] = temp
a = [random.random() for i in range(10000)]
t1 = time.time()
bubbleSort(a)
t2 = time.time()
print(t2 - t1)
排序 10000 个数字耗时 8.510238409042358 s
2. 选择排序
由于冒牌排序需要交换的次数太多,选择排序在每一轮寻找最小值,将最小值与上方第一个未排序的数据交换,从而节约了时间.
选择排序动态图:
Python 实现:
import time
import random
def selectSort(alist):
for i in range(len(alist)):
minValIndex = i
for j in range(i, len(alist)):
if a[minValIndex] > a[j]:
minValIndex = j
temp = a[i]
a[i] = a[minValIndex]
a[minValIndex] = temp
a = [random.random() for i in range(10000)]
t1 = time.time()
selectSort(a)
t2 = time.time()
print(t2 - t1)
排序 10000 个数字耗时4.438132286071777s
3. 快速排序
快速排序中使用了一个基数和 2 个哨兵,在每一轮排序中将小于基数的数放在左侧,大于基数的数放在右侧,每一轮排序后将原始数据划分为两个区间,随后继续对子区间排序:
快速排序动态图:
Python 实现:
import time
import random
def quickSort(alist):
quickSortHelper(alist, first=0, last=len(alist)-1)
def quickSortHelper(alist, first, last):
if first < last:
base = alist[first]
l = first
r = last
while r != l:
while alist[r] >= base and r != l:
r -= 1
while alist[l] <= base and l != r:
l += 1
if l != r:
temp = alist[l]
alist[l] = alist[r]
alist[r] = temp
alist[first] = a[l]
a[l] = base
quickSortHelper(alist, first, l-1)
quickSortHelper(alist, l+1, last)
a = [random.random() for i in range(10000)]
t1 = time.time()
quickSort(a)
t2 = time.time()
print(t2 - t1)
排序 10000 个数字耗时 0.022938966751098633s
REFERENCES:
1. 排序动态图
2. Python 数据结构与算法分析
完结 🍻