基本思想:
1)选择一个基准元素,通常选择第一个元素或者最后一个元素
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值比基准值大。
3)此时基准元素在其排好序后的正确位置
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
冒泡排序的升级版;现在用的最多的排序方法;
注意:如果序列基本有序或序列个数较少,则可以采用简单插入排序,因为快速排序对于这些情况效率不高
不稳定排序算法
时间复杂度:最好:O(nlogn), 最坏:O(n^2) , 平时时间复杂度为O(nlogn)
空间复杂度:O(logn)
Python代码实现:
#_*_coding:utf-8_*_
__author__ = 'Alex Li'
def quick_sort(array,left,right):
'''
:param array:
:param left: 列表的第一个索引
:param right: 列表最后一个元素的索引
:return:
'''
if left >=right:
return
low = left
high = right
key = array[low] #第一个值
while low < high:#只要左右未遇见
while low < high and array[high] > key: #找到列表右边比key大的值 为止
high -= 1
#此时直接 把key(array[low]) 跟 比它大的array[high]进行交换
array[low] = array[high]
array[high] = key
while low < high and array[low] <= key : #找到key左边比key大的值,这里为何是<=而不是<呢?你要思考。。。
low += 1
#array[low] =
#找到了左边比k大的值 ,把array[high](此时应该刚存成了key) 跟这个比key大的array[low]进行调换
array[high] = array[low]
array[low] = key
quick_sort(array,left,low-1) #最后用同样的方式对分出来的左边的小组进行同上的做法
quick_sort(array,low+1, right)#用同样的方式对分出来的右边的小组进行同上的做法
if __name__ == '__main__':
array = [96,14,10,9,6,99,16,5,1,3,2,4,1,13,26,18,2,45,34,23,1,7,3,22,19,2]
#array = [8,4,1, 14, 6, 2, 3, 9,5, 13, 7,1, 8,10, 12]
print("before sort:", array)
quick_sort(array,0,len(array)-1)
print("-------final -------")
print(array)
简洁版:
def quick_sort(lists):
left = []
right = []
count = len(lists)
if count <= 1:
return lists
#以传入数组第一个元素为参照值,循环与剩下的所有元素比较,比参照值大的放right,否则放left
for i in range(1,count):
if lists[i] > lists[0]:
right.append(lists[i])
else:
left.append(lists[i])
# left中有两个或以上元素就需要递归,right也是
if len(left) > 1:
left = quick_sort(left)
if len(right) > 1:
right = quick_sort(right)
#把参照值放到left最右边(也可以放right最左边)
left.append(lists[0])
#合并left和right后返回
return left + right
编程思路:
使用了分治法,最重要的是迭代的方法,使得代码简洁
定义左端和右端列表,首先以第一个元素lists[0]为基准元素,循环序列和基准比较,大的放右边,小的放左边。假如左右还大于1个元素,就迭代进行排序,把参考值放到left的最右边,然后合并左右,返回。