2017/9/6学习内容____用Python实现分治排序算法

quicksork 分治排序 

# 需求
# quick sort 快速排序
# 分治排序算法
# 该算法首先去一个划分元素(partition element 也称为pivot)
# 然后重排列表,将其划为3分,left(<pivot),pivot,right(>pivot)
# 此时pivot已经在列表的最终位置上
# 最后分别对left和right两部分进行递归排序

其中:划分元素的选取直接影响快速排序算法的效率,通常选择列表的第一个元素、中间元素或最后一个元素作为划分元素
划分过程根据划分元素重新排列表,是快速排序算法的关键所在

优点:原位排序(只使用很小的辅助栈)
缺点:不稳定

# -*- coding:utf-8 -*-
# Author : Iriving

# 需求
# quick sort 快速排序
# 分治排序算法
# 该算法首先去一个划分元素(partition element 也称为pivot)
# 然后重排列表,将其划为3分,left(<pivot),pivot,right(>pivot)
# 此时pivot已经在列表的最终位置上
# 最后分别对left和right两部分进行递归排序

def partition(List,first,last):
    # 选取列表中第一个元素作为划分元素
    pivot = List[first]
    leftmark = first+1
    rightmark = last
    while True:
        while List[leftmark]<=pivot:
            # 若列表中存在小于等于pivot的值,放在left部分
            # 以下代码用来检测pivot是列表的最大元素
            # 防止leftmark越界
            if leftmark == rightmark:
                break
            leftmark+=1
        while List[rightmark]>pivot:
            # 大于pivot 放在right部分
            # rightmark自动停留在first处
            rightmark-=1
        if leftmark < rightmark:
            # 此时leftmark的元素大于pivot
            # rightmark的元素<pivot
            # 交换两者
            List[leftmark],List[rightmark] = List[rightmark],List[leftmark]
        else:
            break
        # 交换first处的划分元素与rightmark处的元素
    List[first],List[rightmark] = List[rightmark],List[first]
    # 返回元素pivot的最终位置
    return rightmark

def qsort(L,first,last):
    if first < last:
        split = partition(L,first,last)
        qsort(L,first,split-1)
        qsort(L,split+1,last)

def quicksort(L):
    qsort(L,0,len(L)-1)

num_list = [5,-4,6,3,7,11,1,2]
print('排序之前'+str(num_list))
quicksort(num_list)
print('排序之后'+str(num_list))

执行结果:

排序之前[5, -4, 6, 3, 7, 11, 1, 2]
排序之后[-4, 1, 2, 3, 5, 6, 7, 11]

 

posted @ 2017-09-06 21:08  Iriving  阅读(500)  评论(0)    收藏  举报