快速排序的思路是:先从数集中取出一个数字a,将其他所有的数字只要大于a的放到右边,只要小于a的放到左边;这样重复两边的操作,最后完成完全排序。
下面是学习过程中的代码(引用博客https://blog.csdn.net/razor87/article/details/71155518),我用自己的电脑试验了三种方式的排序;我想试验一下三种方法哪种需要的时间少,没试之前认为第一种方法会用的时间比较多,因为它总是在创建list,但是出乎意料,第一种方法所用时间最少;看来代码简洁同时又用时最少的还是比较好。
import numpy as np
import copy
import time
import matplotlib.pyplot as plt
size_list = range(2,100002,1000)
aa = {str(x):np.random.randint(0,x,x) for x in size_list}
a = copy.deepcopy(aa)
a1 = copy.deepcopy(aa)
#===============================================================================
quick_sort1 = lambda array: array if len(array) <= 1 else \
quick_sort1([item for item in array[1:] if item <= array[0]]) + \
[array[0]] + \
quick_sort1([item for item in array[1:] if item > array[0]])
sort1_time = []
for x in size_list:
start_time1 = time.time()
b = quick_sort1(aa[str(x)])
end_time1 = time.time()
sort1_time.append(end_time1-start_time1)
print('quicksort1 using time:',sort1_time)
#===============================================================================
def quick_sort2(array, left, right):
if left >= right:
return
low = left
high = right
key = array[low]
while left < right:
while left < right and array[right] > key:
right -= 1
array[left] = array[right]
while left < right and array[left] <= key:
left += 1
array[right] = array[left]
array[right] = key
quick_sort2(array, low, left - 1)
quick_sort2(array, left + 1, high)
sort2_time = []
for x in size_list:
start_time1 = time.time()
quick_sort2(a[str(x)],0,x-1)
end_time1 = time.time()
sort2_time.append(end_time1-start_time1)
print('quicksort2 using time:',sort1_time)
#===============================================================================
def quick_sort3(array, l, r):
if l < r:
q = partition(array, l, r)
quick_sort3(array, l, q - 1)
quick_sort3(array, q + 1, r)
def partition(array, l, r):
x = array[r]
i = l - 1
for j in range(l, r):
if array[j] <= x:
i += 1
array[i], array[j] = array[j], array[i]
array[i + 1], array[r] = array[r], array[i+1]
return i + 1
sort3_time = []
for x in size_list:
start_time1 = time.time()
quick_sort3(a1[str(x)],0,x-1)
end_time1 = time.time()
sort3_time.append(end_time1-start_time1)
print('quicksort3 using time:',sort1_time)
#===============================================================================
plt.figure()
lable_line = ['method1','method2','method3']
plt.plot(sort1_time)
plt.plot(sort2_time)
plt.plot(sort3_time)
plt.legend(lable_line)
结果: