python 八大排序快速排序

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)

 

posted on 2017-09-28 22:08  HZQ_HZA  阅读(245)  评论(0编辑  收藏  举报

导航