目录
排序算法系列第二篇,本节介绍插入、选择排序,开始之前稍微比较一下冒泡、插入、选择排序。
冒泡排序 | 插入排序 | 选择排序 | |
平均时间复杂度 | O(n*n) | ||
最好情况/最坏情况 | O(n)/O(n*n) | O(n)/O(n*n) | O(n*n)/O(n*n) |
空间复杂度 | O(1) | ||
稳定性 | 稳定 | 稳定 | 不稳定 |
其实,这三个排序至今已经很少使用了,但是作为鼻祖,理解掌握它们有助于理解其他排序算法。
插入排序
基本思想:在待排序的记录序列中选取一个记录插入到前面已排好序的适当位置,如此反复,直到所有待排序记录全部插入完。
举个例子,摸牌的时候在手上插牌的过程,手上的牌已经排好序,新摸的牌插入已经排好的牌中,这一过程就和插入排序十分相似。
以数组[7,2,8,3,1,5]为例,手写演示过程:
代码,以R语言为例
InsertSort=function(array){
n=length(array)
for(i in 2:n){
markvalue=array[i]
j=i-1
while(j>0){
if(array[j]>markvalue){
array[j+1]=array[j]
array[j]=markvalue
}
j--
}
}
return(array)
}
选择排序
基本思想:首先在未排序序列中找到最小元素,存放到起始位置;再从剩余中继续寻找最小元素...
用一句俗语概括就是,“矮子里挑将军!!”
先从队伍里把最厉害的人找出来,再从剩下的队伍里找出最厉害的人,也就是第二厉害的人,直到挑完为止。
代码,以R为例
selectsort <- function(array){
n=length(array)
for(i in 1:(n-1)){
minindex=i
for(j in i+1:n){
if(array[minindex]>array[j]){
minindex=j
}
temp=array[i]
array[i]=array[minindex]
array[minindex]=temp
}
print(array)
}
return(array)
}