python小程序
//
晚上没事儿干,用python写了个快排小程序,分享出来看看:
快速排序:
#! /usr/bin/env python
# -*- coding:utf8 -*-
from random import randrange, shuffle
'''
基本思想:
通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。
基本流程:通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。
稳定性:不稳定
复杂度:在最坏情况下是O(N^2),平均的时间复杂度是O(N*lgN)
'''
# 自动生成list
def generate_array():
array = []
while len(array) < 12:
array.append(randrange(0, 101, 3))
print("before sort array is {}".format(array))
shuffle(array)
return array
def quick_sort(array, head, tail):
# 如果head > tail 则直接返回
if head >= tail:
return array
# 否则进行排序
else:
start, end = head, tail
base = array[start] # 设置基准数为左侧数字
while start < end:
# 从右边开始判断,如果列表右边的数比基准数大或者相等
while start < end and array[end] >= base:
end = end-1 # 不进行操作,将end向前移动一位
# 如果找到不满足条件的数字,则把end的数字复制给start
array[start] = array[end]
# 同样的方法比较前半区
while start < end and array[start] <= base:
start = start+1
array[end] = array[start]
# 这轮比较做完之后,列表被分成了两个半区,此时start=end
array[start] = base # 或者array[end]=base也可以
print("middle result is {0},base is {1}".format(array, base))
quick_sort(array, head, start-1)
quick_sort(array, start+1, tail)
return array
arr = generate_array()
result = quick_sort(arr, 0, len(arr)-1)
print("after sort is {}".format(result))
输出结果如下,其中base是每一次交换使用的基准数字:
before sort array is [96, 6, 63, 63, 51, 75, 63, 12, 0, 39, 33, 0]
middle result is [12, 6, 63, 39, 33, 0, 63, 0, 51, 63, 96, 75],base is 63
middle result is [0, 6, 0, 12, 33, 39, 63, 63, 51, 63, 96, 75],base is 12
middle result is [0, 6, 0, 12, 33, 39, 63, 63, 51, 63, 96, 75],base is 0
middle result is [0, 0, 6, 12, 33, 39, 63, 63, 51, 63, 96, 75],base is 6
middle result is [0, 0, 6, 12, 33, 39, 63, 63, 51, 63, 96, 75],base is 33
middle result is [0, 0, 6, 12, 33, 39, 63, 63, 51, 63, 96, 75],base is 39
middle result is [0, 0, 6, 12, 33, 39, 51, 63, 63, 63, 96, 75],base is 63
middle result is [0, 0, 6, 12, 33, 39, 51, 63, 63, 63, 96, 75],base is 51
middle result is [0, 0, 6, 12, 33, 39, 51, 63, 63, 63, 75, 96],base is 96
after sort is [0, 0, 6, 12, 33, 39, 51, 63, 63, 63, 75, 96]