A、快速排序
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
如列表:
lst =[6,1,2,7,9,3,4,5,10,8]
[6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
从右向左开始移动第一次
当j移动到5此时lst[j]小于key6
i j 值互换
[5, 1, 2, 7, 9, 3, 4, 6, 10, 8]
从左向右开始移动第一次
当i移动到7此时lst[i]大于key6
i j 值互换
[5, 1, 2, 6, 9, 3, 4, 7, 10, 8]
从右向左开始移动第二次
当j移动到4此时lst[j]小于key6
i j 值互换
[5, 1, 2, 4, 9, 3, 6, 7, 10, 8]
从左向右开始移动第二次
当i移动到9此时lst[i]大于key6
i j 值互换
[5, 1, 2, 4, 6, 3, 9, 7, 10, 8]
从右向左开始移动第三次
当j移动到3此时lst[j]小于key6
i j 值互换
[5, 1, 2, 4, 3, 6, 9, 7, 10, 8]
此时6 刚好在中间
lst分成两部分
左边[5, 1, 2, 4, 3]
右边[9, 7, 10, 8]
重新按照刚刚排序方法
将得到结果
左边[3, 1, 2, 4, 5]
右边[8, 7, 9, 10]
继续排序
.....(递归)
实现方法:
面向过程:
# -*- coding: gbk -*- __author__ = 'HZQ' lst = [6,1,2,7,9,3,4,5,10,8] i=0 j=len(lst)-1 key=lst[0] print(lst) print("从右向左开始移动第一次") while lst[j]>=key and j>i: j-=1 print("当j移动到{}此时lst[j]小于key{}".format(lst[j],key)) print("i j 值互换") lst[i],lst[j]=lst[j],lst[i] print(lst) print("从左向右开始移动第一次") while lst[i]<=key and j>i: i+=1 print("当i移动到{}此时lst[i]大于key{}".format(lst[i],key)) print("i j 值互换") lst[i],lst[j]=lst[j],lst[i] print(lst) print("从右向左开始移动第二次") while lst[j]>=key and j>i: j-=1 print("当j移动到{}此时lst[j]小于key{}".format(lst[j],key)) print("i j 值互换") lst[i],lst[j]=lst[j],lst[i] print(lst) print("从左向右开始移动第二次") while lst[i]<=key and j>i: i+=1 print("当i移动到{}此时lst[i]大于key{}".format(lst[i],key)) print("i j 值互换") lst[i],lst[j]=lst[j],lst[i] print(lst) print("从右向左开始移动第三次") while lst[j]>=key and j>i: j-=1 print("当j移动到{}此时lst[j]小于key{}".format(lst[j],key)) print("i j 值互换") lst[i],lst[j]=lst[j],lst[i] print(lst)
面向对象:
# -*- coding: gbk -*- __author__ = 'HZQ' lst = [6,1,2,7,9,3,4,5,10,8] def minddle_index(lst,low,high): start_index=low#最左边 end_index=high#左右边 if start_index<end_index:#前提条件右边大于左边 key=lst[start_index]#设置参照key while end_index>start_index: while lst[end_index]>=key and end_index>start_index: end_index-=1 lst[start_index],lst[end_index]=lst[end_index],lst[start_index] while lst[start_index]<=key and end_index>start_index: start_index+=1 lst[start_index],lst[end_index]=lst[end_index],lst[start_index] #循环排序,递归 minddle_index(lst,low,start_index-1)#左边lst再次排序 minddle_index(lst,end_index+1,high)#右边lst再次排序 minddle_index(lst,0,len(lst)-1) print(lst)