快速排序
算法思想:
每次从序列中找一个元素出来,然后以该元素为标准,把序列中比该元素小的元素,放在该元素左边,比该元素大的元素放在该元素右边。然后对左右两个序列继续递归,直到左右两个序列中只剩一个元素或没有元素时
时间复杂分析:
平均是O(nlogn) , 最坏是O(n^2)
我们可以把该算法看成一个树,按照平均来算,及每一次调用处理的数据都是n,但树的高度,与每次选取的标准元素有关,如果每次产生的左、右两个序列的元素个数相同,即树的高度是logn。那么计算得,n*logn
如果最坏:如果序列本身就是有序的,由于快排,在运行过程中不判断是否已经有序,所以每次依然会进行左右分,这样左边始终为空,右边为n-i,最终生成的树高度为n,所以n*n=n^2
下面代码中,每次把当前数组中的第一个元素作为比较的标准元素
def quickSort(arr):
if len(arr)<=1:
return arr
flag=arr[0] #选取第一个元素为比较的标准
i=1
left = []
right = []
j=1
while i<len(arr):
if arr[i] < flag:
left.append(arr[i])
else:
right.append(arr[i])
i+=1
return quickSort(left) + [flag] + quickSort(right)
if __name__ == '__main__':
arr=quickSort([3,5,6,4,2,1,5,6,8])
print(arr)