算法——快速排序
基本概念
归并排序:
将数组分为两数组分别排序,并将有序的数组归并使主数组有序。主要耗费的时间在合并
快速排序:
通过一个主元,使素组分为两个子数组,左子数组的值小于主元的值,右子数组的值大于 主元的值。将这两个子数组排序也就将整个数组进行了排序。主要耗费的时间在排序上。如果合并要花费大量时间,那就得不偿失了。
基本的思路
第一步
[3,1,6,2,5,8,4,7]-----------以第一个元素为主元,从第二个元素向右找第一个大于主元的元素a,从最后一个元素向前找第一个小于等于主元的元素b,交换a,b的值,继续从当前位置判断。当两个指针交错后,交换主元与b的值(最后一个小于等于主元的元素),结束本次循环。
[3,1,6,2,5,8,4,7]
[3,1,2,6,5,8,4,7]
[3,1,2,6,5,8,4,7]
[2,1,3,6,5,8,4,7]
[2,1] [3] [6,5,8,4,7]
第二步
以相同的方法继续对左右两子集进行排序
[1,2][3][6,5,4,8,7]
[1,2][3][4,5,6,8,7]
[1,2][3][4,5][6][8,7]
第三步
[1,2][3][4,5][6][7,8]
时间复杂度
O(logN)
变种的代码实现
def quickSort(num):
if len(num)>=2:
#取第一个数为主元作为判断点 可以取任意位置的值作为主元
start = num[0]
num.remove(start)
left = []
rigth = []
for i in num:
if start>i:
#小于主元的数存左边
left.append(i)
else:
#大于主元的数存右边
rigth.append((i))
#归并 子集
return quickSort(left)+[start]+quickSort(rigth)
else:
return num
pass