排序算法

先放张结论:borrow from 排序算法-八大排序实现和性能比较

  • 快速排序

i,j是两个位置标记,分别从左和右端向中间逼近

先选定list中一个数为base,j从后往前找,如果发现比base小,则将base替换成这个数,i开始往后找比base大的数,如果有,替换掉j处的数字,直至ij两者相遇,此时放回base到i的位置。这个过程将比base小的数都移到了左边,比base大的数都移到了右边。然后对左右两个区间分别用递归做上述过程即可。

myList = [49,38,65,97,76,13,27,49]
start = 0
end = len(myList)-1

def quicksort(myList, start, end):
    if start > end:
        return 'error'
    else:
        i = start
        j = end
    base = myList[i]
    while(i<j):
        while (i<j) and myList[j] >= base:
            j = j - 1
        myList[i] = myList[j]
        
        while(i<j) and myList[i] <= base:
            i = i + 1
        myList[j] = myList[i]
    myList[i] = base
    quicksort(myList,start,i-1)
    quicksort(myList,i+1,end)
    return myList

print(quicksort(myList,start,end))

例子:

初始  [49,38,65,97,76,13,27,49] (49为base)

1        [27,38,65,97,76,13,27,49]

2        [27,38,65,97,76,13,65,49]

3        [27,38,13,97,76,13,65,49]

4        [27,38,13,97,76,97,65,49]

4        [27,38,13,49,76,97,65,49]

完成一次比较,对左右区间重复该过程

 

  • 归并排序

归并的思想是假设左右分区已经是有序的了,用merge来合为一个有序列表,其实就是用两个指针标记两个分区元素的位置,比较哪个小就塞入新列表,这个分区的指针位置向后移一位。前面假设的左右分区是有序的是通过递归来实现,见merge_sort。

List = [49,38,65,97,76,13,27,49]
def merge_sort(List):
    if len(List) <= 1:
        return List
    mid = len(List) // 2
    left = merge_sort(List[:mid])
    right = merge_sort(List[mid:])
    return merge(left,right)

def merge(left,right):
    i = 0
    j = 0
    result = []
    while(i<len(left)) and (j<len(right)):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result.extend(left[i:])
    result.extend(right[j:])
    return result
print(merge_sort(List))

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>