Python实现选择排序、冒泡排序、快速排序

1.选择排序

#选择排序
#每次找出一个最小值
def SelectSort(lst):
    n = len(lst)
    for i in range(n):
        valueI = lst[i]
        for j in range(i+1,n):
            tmp2 = lst[j]
            if valueI > tmp2:
                lst[i],lst[j] = tmp2,valueI
                valueI = tmp2
    return lst

2.冒泡排序

#冒泡排序
#每次通过比较相邻两点的值,如果右边比左边小,则交换两者的位置,
#每轮可选出一个参与排序的最大值
def BubbleSort(lst):
    n = len(lst)
    for i in range(n):
        for j in range(0,n-i-1):
            if(lst[j]>lst[j+1]):
                lst[j],lst[j+1] = lst[j+1],lst[j]
    return lst


#冒泡排序有一处可优化的地方
#当某轮排序不发生交换时,说明序列已有序,即可推出排序

def BubbleSort(lst):
    n = len(lst)
    for i in range(n):
        flag = False
        for j in range(0,n-i-1):
            if(lst[j]>lst[j+1]):
                flag = True
                lst[j],lst[j+1] = lst[j+1],lst[j]
        if flag == False:
            break
    return lst

3.快速排序

#快速排序
#采用分治的方法,选择lst[0]作为中间点,将大于lst[0]的换到右边,小于lst0]的换到左边,递归

import numpy as np
lst = list(np.random.randint(1000,size=100000))
def QuickSort(lst):
    n = len(lst)
    if n <= 1:
        return lst
    midValue = lst[0]
    leftIdx = 1
    rightIdx = n-1

    while(leftIdx != rightIdx):
        #右端点小于lst[0]则在从左端点出发,直接找到一个大于lst[0]的点,两点互换,来实现左侧都小 
        #于右侧
        if (lst[rightIdx] <= midValue):
            if (lst[leftIdx]<=midValue):
                leftIdx += 1
            else:
                lst[leftIdx],lst[rightIdx] = lst[rightIdx],lst[leftIdx]
                rightIdx -= 1
        else:
            rightIdx -= 1
    if (lst[leftIdx]<=midValue):
        return QuickSort(lst[1:leftIdx+1])+ [midValue] + QuickSort(lst[leftIdx+1:])
    else:
        return QuickSort(lst[1:leftIdx])+ [midValue] + QuickSort(lst[leftIdx:])

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值