之所以会重温算法和数据结构,与对逐渐开发的过程中发现的问题,渐渐的对算法和数据结构对程序设计及稳定性的重要作用。
现在,很多人都很难重新安静的开始重新的阅读这些经典、
如果想拜读一遍算法导论,而又因为难度太大看不下去的,可以参考MIT的算法导论的视频,虽然不清晰,但是讲得非常好!
关于插入排序,这是算法导论中讲到的第一个排序算法,这个算法的时间复杂度O(n^2),具体的算法的计算和证明可以参考原
书的讲解。
主体的思想:其实原理很简单
循环的初始化:就是从第2位开始提取一个数出来key,初始条件
循环的保持:遍历从第2 位到最后一位作为key,遍历key前面的所有数据与key比较,完成交换,
循环的终止:遍历到最后一位,遍历到小于key的数
下图比较清晰:
插入排序的伪代码如下:
原书伪代码:
InsertSort(A)//A[1,2,….n]
Forj<-2 to length(A)
Do key = A[j]
i=j-1
Whilei >0 and A[i] >= key
A[i+1]<- A[i]
i= i-1
A[i+1] <- key
使用for循环的伪代码,原理一样
InsertSort(A)
for j = 2 to A.length //or for j=1 to A.length -1 具体根据数组的下标而定
key = A[j]
for i = j-1 to 1
if A[i] > key
A[i+1] = A[i]
else
break
A[i+1] = key //前面已经减1
C++实现源代码,不考虑泛型的简单实现,和泛型实现:
char * InsertSort(char* pSeq, int iLength)
{
for(int j = 1; j< iLength; j++)
{
char iKey = *(pSeq + j);
int i = 0;
for(i = j-1; i>= 0; --i)
{
if(*(pSeq + i) > iKey){
*(pSeq + i + 1) = *(pSeq + i);
} else {
break;
}
}
*(pSeq + i + 1) = iKey;
}
return pSeq;
}
int main(int argc, char* argv[])
{
char szBuf[6] = {5,2,4,6,1,3};
char *pBuf = InsertSort(szBuf, 6);
}
泛型实现:
template<class T> void InsertSortT(T a[], int iLength)
{
for(int j= 1; j< iLength; j++)
{
T key = a[j];
int i = j-1;
while( i>= 0 && a[i] > key)
{
a[i + 1] = a[i];
i = i-1;
}
a[i+1] = key;
}
}
Python 实现代码后续补上 待续