python排序算法

一.冒泡排序

算法描述:冒泡排序分为内循环和外循环,外循环是排序轮次,特点是每一次排序都会将最大的排在最后,内循环是每一轮排序需要排序的元素个数,所以时间复杂度是O(n^2)

def Bubble(arr):
   #外层控制遍历次数,因为每一次会把最大的数排在最后,最后一次不用排序所以遍历len(arr)-1次
   for i in range(len(arr)-1): 
      # 内层控制每次遍历时未排序的元素索引,外层循环一次后,内部需要排序的元素就少一个,所以循环len(arr)-i-1次
        for j in range(0,len(arr)-i-1):
           if arr[j]>arr[j+1]:
                arr[j],arr[j+1] = arr[j+1],arr[j]  # 当前一个比后一个数大,交换他们的位置
    return arr

print(Bubble([2,5,1,6,7]))
     

二.选择排序

算法描述:以第一个数为基准,找到剩下的数中最小的数和它比较,若小则交换,若第一个数已是最小,则再已第2个数为基准比较,遍历所有元素,最后一个元素不用比较,所以外层循环是比较的轮次,内层循环是从基准数进行向后遍历,若是后面的数比他小,则将后面的数记作较小的数,一步步比较,直到比较到最后一个数则可判断出最小的数,一个轮次比较完毕。

时间复杂度为O(n^2)

def select(nums):
    for i in range(len(nums)-1):  #定义外层循环为循环轮次
        min_index = i
        for j in range(i,len(nums)): #定义内层循环从i开始到结束,为比较次数
            if nums[min_index]>nums[j]:  
                min_index = j
        if min_index!=i:   #如果i之后有比nums[i]更小的数,则交换两数位置
            nums[i],nums[min_index] = nums[min_index],nums[i]
    return nums

print(select([4,2,3,1,9,6,7]))

三.快速排序

算法描述:

采用双指针,递归和分治思想解决的

一般采用第一个数是基准数,指定左起始点和右起始点,右起始点向左遍历,找到比基准数小的停下,左起始点向右遍历,找到比基准数大的停下,若此时左起始点和右起始点未重合,则交换左起始点和右起始点的数,再进行左右移动,直到重合,交换基准数和重合点的数,此时基准数左边都是比他小的数,右边都是比他大的数,第一次排序完成,再递归对它左边和右边的数进行排序。

快排的时间复杂度为O(nlogn)

def partition(arr,l,r):
    i = l
    j = r
    ini=arr[l]
    while i != j:  #左右指针没重合
        while i < j and arr[j]>ini:   
           j-=1
        while i < j and arr[i]<=ini:
           i+=1
        if i<j:
            arr[i],arr[j] = arr[j],arr[i]      
    arr[l],arr[j] = arr[j],arr[l]
    return i

def quick_sort(arr,l,r):
    if l>=r:
        return
    index = partition(arr,l,r)     # 第一次排序返回的中间坐标
    quick_sort(arr,l,index-1)     # 递归执行左边的
    quick_sort(arr, index+1, r)   # 递归执行右边的
    return arr

print(quick_sort([2,8,1,5,4],0,4))

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值