快速排序
来源:互联网 发布:淘宝怎么看年销售额 编辑:程序博客网 时间:2024/05/17 22:55
也称其为分治法。基本思想:
快速排序复杂度:当基数值不能很好的分割数组,即一个子数组比原来数组小1,这是快速排序最差的情况。如果每次划分都出现这种情况,快排就退化为冒泡。时间复杂度为n^2. 最好的情况是每次把数组分成大小相等的两个数组,则时间复杂度为nlogn.
1. 从数列中取出一个数作为基准数。
2. 分区过程,将比这个数大的数全放在它的右边,小于或等于它的数全放在它的左边。再对左右区间重复第二步,知道各个区间只有一个数。
java实现快速排序:固定取样法,此方法性能较差,可优化为随机切分法和三取样法。
public static int partition(int []array,int lo,int hi){ //固定的切分方式 int key=array[lo]; while(lo<hi){ while(array[hi]>=key&&hi>lo){//从后半部分向前扫描 hi--; } array[lo]=array[hi]; while(array[lo]<=key&&hi>lo){从前半部分向后扫描 lo++; } array[hi]=array[lo]; } array[hi]=key; return hi; } public static void sort(int[] array,int lo ,int hi){ if(lo>=hi){ return ; } int index=partition(array,lo,hi); sort(array,lo,index-1); sort(array,index+1,hi); }
python实现快速排序:
if __name__ == '__main__':
l = [5,1,3,8,9,4,7,6]
def first_sort(l):
flag = l[-1]
i = -1
for j in range(len(l)-1):
if l[j] > flag:
pass
else:
i += 1
tmp = l[i]
l[i] = l[j]
l[j] = tmp
print(l)
print("\n" + "*"*20 + "\n")
tmp = l[-1]
l[-1] = l[i+1]
l[i+1] = tmp
print(l)
print("\n" + "*"*20 + "\n")
first_sort(l)
l = [5,1,3,8,9,4,7,6]
def first_sort(l):
flag = l[-1]
i = -1
for j in range(len(l)-1):
if l[j] > flag:
pass
else:
i += 1
tmp = l[i]
l[i] = l[j]
l[j] = tmp
print(l)
print("\n" + "*"*20 + "\n")
tmp = l[-1]
l[-1] = l[i+1]
l[i+1] = tmp
print(l)
print("\n" + "*"*20 + "\n")
first_sort(l)
0 0