冒泡排序,选择排序,插入排序,快速排序的python实现

1.冒泡排序

每轮循环中依次比较相邻两个数的大小,交换元素顺序使得大的值往后移动,时间复杂度O(n2)

#冒泡排序
def BubbleSort(array):
    for i in range(len(array)-1):
        for j in range(len(array)-i-1):
            if array[j]>array[j+1]:
                array[j+1],array[j]=array[j],array[j+1]
    return array 

2.选择排序

每轮循环中比较所有的元素,每次都选择出该轮循环最小的值放在左边,从左至右升序排列,时间复杂度为O(n2)

def SelectionSort(array):
    for i in range(len(array)-1):
        for j in range(i+1,len(array)):
            if array[j]<array[i]:
                array[i],array[j]=array[j],array[i]
    return array

3.插入排序

每轮循环中,比较相邻的数,将小的数插入到大的数的前面,时间复杂度为O(n2)

#插入排序
def InsertSort(array):
    for i in range(1,len(array)):
        pos=i
        temp=array[pos]
        while pos>0 and array[pos-1]>array[pos]:
            array[pos]=array[pos-1]
            array[pos-1]=temp 
            pos=pos-1
    return array

4.快速排序

随机选择中轴值(例如每次选择该区中的第一个元素为中轴值),将数组分区,比中轴值小的元素排在左边,比中轴值大的排在右边,在各子区按以上方法重复分区,最终的子区中将会有1个元素或0个元素(基准情形),完成排序。时间复杂度为O(nlogn)/相同元素排序代码会无限递归,已发文更正

#快速排序:
def quicksort(array):    
    if len(array)<2:
        return array
    else:
        pivot=array[0]
        array.remove(pivot)  # 从原数组中移除基准值,避免出现无限递归
        less=[x for x in array if x <= pivot]
        more=[x for x in array if x > pivot]
        return quicksort(less)+[pivot]+quicksort(more)

排序算法的稳定性

1.稳定:当A=B,元素A原本在B前面,排序完成后A仍然在B的前面。

2.不稳定:当A=B,A原本在B的前面,排序之后A可能会出现在B的后面。

冒泡排序和插入排序,比较元素时均为相邻比较,因此不会出现同值元素位置互换;选择排序,在某一轮比较时可能出现元素之间跳跃交换,因此不稳定;快速排序的中轴值选定后,以以上代码为例,原本在中轴值右边的同值元素会分到左区,因此不稳定。总结如下表:

排序方法时间复杂度稳定性
冒泡排序O(n2)稳定
选择排序O(n2)不稳定
插入排序O(n2)稳定
快速排序O(nlogn)不稳定

 

欢迎关注公众号:算法学习总结,获取更多知识,共同交流学习

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您介绍这几种排序算法。 1. 冒泡排序:它是一种简单的排序算法,通过不断交换相邻的元素来将序列排序。具体来说,它每次比较相邻的两个元素,如果顺序不对就交换它们的位置。重复这个过程直到所有元素都排好序为止。时间复杂度为 O(n^2)。 2. 直接插入排序:它是一种稳定的排序算法,它每次将一个待排序的元素插入到已经排好序的序列中。具体来说,它从第二个元素开始,将其插入到已经排好序的前面的序列中。时间复杂度为 O(n^2)。 3. 折半插入排序:它是一种改进的直接插入排序算法,它通过二分查找的方式来寻找插入位置,从而减少了比较次数。具体来说,它将待排序的元素插入到已经排好序的序列中,但是它是通过二分查找来寻找插入位置的。时间复杂度为 O(n^2)。 4. 简单选择排序:它是一种简单的排序算法,它每次选择一个最小的元素,并将其放到已经排好序的序列的末尾。具体来说,它从第一个元素开始,找到最小的元素并将其放到第一个位置,然后从剩余的元素中找到最小的元素并将其放到第二个位置,以此类推。时间复杂度为 O(n^2)。 5. 快速排序:它是一种高效的排序算法,它通过分治的方式来将序列分成两个子序列,然后对这两个子序列分别进行排序。具体来说,它选择一个基准元素,将序列分成两个子序列,左边的子序列都比基准元素小,右边的子序列都比基准元素大。然后递归地对左右子序列进行快速排序。时间复杂度为 O(nlogn)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值