小编在学习了数据结构、算法分析设计、Java、Python等之后,回顾所学发现见到最多的还是各种排序算法,站在前辈的肩膀上,决定做个总结。
一、概述:
常见的排序算法基本可以分为十种(见下图),除此之外,还有结合多种算法思想基于他们的改进变种。
1. 插入排序、选择排序、交换排序:这三大类基于比较的排序算法,时间复杂度会随着优化程度在O(n^2)~O(nlogn)之间变化;
2. 希尔排序、快速排序、堆排序:它们分别代表着杰出的优化策略;
3. 归并排序:基于分治递归思想,将待排数据像二叉树一样分化至最简单的一个数排序问题,子问题合并时间复杂度可控制在O(n),不难想到整体时间复杂度取决于树的深度,即达到O(nlogn);
4. 计数排序、桶排序、基数排序:这三种线性时间排序算法本质上运用了相同的思想,先将数据按一定映射关系分组(桶),然后桶内排序,顺序输出。三种姑且称为‘桶’排序算法在分组函数使用上不同,导致分组粒度不同,带来的额外空间开销出现差异。这三种排序算法适用于数据满足一定的条件,否则额外的空间开销将无法承受。
二、算法简介及代码展示
1.简单插入排序
简单插入排序操作n-1轮,每轮将一个未排序树插入排好序列。
开始时默认第一个数有序,将剩余n-1个数逐个插入。插入操作具体包括:比较确定插入位置,数据移位腾出合适空位
代码如下:
def InsertSort(ls):
n=len(ls)
if n<=1:
return ls
for i in range(1,n):
j=i
target=ls[i] #每次循环的一个待插入的数
while j>0 and target<ls[j-1]: #比较、后移,给target腾位置
ls[j]=ls[j-1]
j=j-1
ls[j]=target #把target插到空位
return ls
2.希尔排序
希尔排序是插入排序的高效实现,对简单插入排序减少移动次数优化而来。
简单插入排序每次插入都要移动大量数据,前后插入时的许多移动都是重复操作,若一步到位移动效率会高很多。
若序列基本有序,简单插入排序不必做很多移动操作,效率很高。
希尔排序将序列按固定间隔划分为多个子序列,在子序列中简单插入排序,先做远距离移动使序列基本有序;逐渐缩小间隔重复操作,最后间隔为1时即简单插入排序。
代码如下:
def ShellSort(ls):
def shellinsert(arr,d):
n=len(arr)
for i in range(d,n):
j=i-d
temp=arr[i] #记录要出入的数
while(j>=0 and arr[j]>temp): #从后向前,找打比其小的数的位置
arr[j+d]=arr[j] #向后挪动
j-=d
if j!=i-d:
arr[j+d]=temp
n=len(ls)
if n