经典十大排序算法

版权声明:本文为博主原创文章,转载时请注明出处!谢谢 https://blog.csdn.net/qq_34783311/article/details/89458602
近期还在找实习的菜鸡我,流下了没有技术的眼泪(嘤嘤嘤。。。。),还是好好的复习一下基础知识,免得被大佬按在地上摩擦,接下来就讲下常用排序算法:
  • 算法思想
  • 代码实现
  • 时间复杂度
  • 空间复杂度
  • 稳定性与否

  • 冒泡排序
算法思想:
 - 比较相邻的元素,如果是逆序就交换;
 - 对每一对相邻元素作同样的工作;
 - 针对所有元素重复以上的步骤,除最后一个;
 - 重复以上步骤

代码实现:
def Bubble_Sort(data):

    flag=True
    for i in range(len(data)-1):
        flag=True
        for j in range(len(data)-1-i):
            if data[j+1]<data[j]:
                data[j+1],data[j]=data[j],data[j+1]
                flag=False
        if flag:
            return data
    return data
data=[1,4,2,8,3,9,10]
print(Bubble_Sort(data))

时间复杂度为:O(n^2),最好的时候是O(n)
空间复杂度为:O(1)
稳定性算法
  • 选择排序
算法思想:
  -首先在未排序序列中找到最大(最小)元素,存放到排序序列的起始位置
  - 然后再从剩余未排序元素中继续寻找最大(小)元素,将其放到已排序序列末尾
  - 重复以上操作,直到排序完毕

代码实现:
   def Select_Sort(data):

    for i in range(len(data)-1):
        minIndex=i
        for j in range(i+1,len(data)):
            if data[j]<data[minIndex]:
                data[j],data[minIndex]=data[minIndex],data[j]

        data[i],data[minIndex]=data[minIndex],data[i]

    return data
data=[1,4,2,8,3,9,10]
print(Select_Sort(data))

时间复杂度为:O(n^2)
空间复杂度:O(1)
稳定性:不是
  • 插入排序
有序+无序
算法思想:
 - 构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置插入
 
代码实现
def Insert_Sort(data):

    for i in range(1,len(data)):
        preIndex=i-1
        current=data[i]
        while preIndex>=0 and data[preIndex]>current:
            data[preIndex+1]=data[preIndex]
            preIndex-=1
        data[preIndex+1]=current
        
    return data

时间复杂度:O(n^2)
空间复杂度:O(1)
稳定算法
  • 希尔排序
缩小增量排序
对每个子表进行直接插入排序,当增量因子为1时,整个序列即为整个序列的长度
  • 归并排序
算法思想:
  - 把长度为n的输入序列分为两个长度为n/2的子序列
  - 对这两个子序列分别采用归并排序
  - 将两个排序好的子序列合并成一个最终的排序序列
 
 时间复杂度:O(nlogn)
 空间复杂度:O(n)
 稳定性排序
  • 快速排序
算法思想:
  - 从数列中选出一个元素,叫做基准
  - 分区操作:一部分小于基准,一部分大于基准
  - 递归地把小于i基准值元素的子序列和大于基准值的子序列排序

代码实现:
  def Qucik_Sort(data,left,right):
    #分区
    if left>=right:
        return

    low=left
    high=right
    key=data[low]
    while left<high:
        while left<right and data[right]>key:
            right-=1
        data[left]=data[right]

        while left<right and data[left]<=key:
            left+=1
        data[right]=data[left]
    data[right]=key
    Qucik_Sort(data,low,left-1)
    Qucik_Sort(data,left+1,high)

时间复杂度:最坏-O(n^2)  最好-O(nlogn) 平均-O(nlogn)
空间复杂度:O(nlogn)
稳定性:不是
  • 堆排序
 - 建堆
 - 将堆顶元素与最后一个元素进行交换,此时得到新的无序区和有序区
 - 调整堆
 - 重复上述过程,直到有序区元素个数为n-1,结束

时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:不是

猜你喜欢

转载自blog.csdn.net/qq_34783311/article/details/89458602