python实现冒泡排序、快速排序,以及执行效率对比
冒泡排序
import time
import random
def bubble_sort(li):
"""冒泡排序"""
length = len(li)
for x in range(0, length - 1):
for y in range(x + 1, length):
if li[x] > li[y]:
li[x], li[y] = li[y], li[x]
if __name__ == '__main__':
start_time = time.time()
li = [i for i in range(10000)]
random.shuffle(li)
bubble_sort(li)
print(time.time() - start_time) # 耗时:9s左右
print(li[:100])
windows2016款机器耗时:7-9秒左右,mac m1耗时:3秒左右。
快速排序-方法1
import random
import time
def partition(li, left, right):
while left < right:
while left < right and li[left] <= li[right]:
left += 1
li[left], li[right] = li[right], li[left]
while left < right and li[right] >= li[left]:
right -= 1
li[right], li[left] = li[left], li[right]
return left
def quick_sort(li, left, right):
if left < right:
mid = partition(li, left, right)
quick_sort(li, left, mid - 1)
quick_sort(li, mid + 1, right)
if __name__ == '__main__':
start_time = time.time()
li = [i for i in range(10000)]
random.shuffle(li)
quick_sort(li, 0, len(li) - 1)
print(time.time() - start_time) # 耗时60ms左右
print(li[:100])
windows2016款机器耗时:60-70毫秒左右。
你的机器耗时多少秒呢?来评论看看
快速排序-方法2
import random
import time
def partition(li, left, right):
tmp = li[left]
while left < right:
while left < right and li[right] >= tmp: # 从右边找比tmp小的数
right -= 1
li[left] = li[right]
while left < right and li[left] <= tmp: # 从左边找比tmp大的数
left += 1
li[right] = li[left]
li[left] = tmp
return left
def quick_sort(li, left, right):
if left < right:
mid = partition(li, left, right)
quick_sort(li, left, mid - 1)
quick_sort(li, mid + 1, right)
if __name__ == '__main__':
start_time = time.time()
li = [i for i in range(1000000)]
random.shuffle(li)
quick_sort(li, 0, len(li) - 1)
print(time.time() - start_time)
print(li[:100])
非递归方法实现快速排序
import time
import random
import collections
def partition(li, left, right):
tmp = li[left]
while left < right:
while left < right and li[right] >= tmp: # 从右边找比tmp小的数
right -= 1
li[left] = li[right]
while left < right and li[left] <= tmp: # 从左边找比tmp大的数
left += 1
li[right] = li[left]
li[left] = tmp
return left
def quick_sort(arr, left, right):
stack = collections.deque()
stack.append(left)
stack.append(right)
while len(stack) > 0:
right = stack.pop()
left = stack.pop()
if left < right:
mid = partition(arr, left, right)
stack.append(left)
stack.append(mid - 1)
stack.append(mid + 1)
stack.append(right)
if __name__ == '__main__':
list1 = [i for i in range(1000000)]
random.shuffle(list1)
print(list1[:100])
start = time.time()
quick_sort(list1, 0, len(list1) - 1)
print(time.time() - start)
print(list1[:100])