重温算法导论(一) 插入排序

之所以会重温算法和数据结构,与对逐渐开发的过程中发现的问题,渐渐的对算法和数据结构对程序设计及稳定性的重要作用。

现在,很多人都很难重新安静的开始重新的阅读这些经典、

如果想拜读一遍算法导论,而又因为难度太大看不下去的,可以参考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 实现代码后续补上 待续


猜你喜欢

转载自blog.csdn.net/hahackeris/article/details/78578059