版权声明:本文为博主原创文章,转载时请注明出处!谢谢 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)
稳定性:不是