最近想对一些排序算法做个总结。当然,这个对绝大多数人来说都是很简单的,或者说都不想去关心的。对于我来说,虽然写了些程序,但是基本功一直没有好好夯实,特此恶补一下。此贴绝非原创,只是自己的一点积累。希望能和大家共勉。例子均以数据结构教材为依照,有些地方做了些修改。
文章其实早就写好,只是因为开通博客后三天之内不能发文章,于是耽搁到现在了
直接插入排序,直接插入排序思路比较简单,就是将待排序数组的第0个位置作为缓存,(这里不讲哨兵,因为本人没上过数据结构的课,前面的内容也没看过,就全看自己理解力,如有不对,请多指教!)从第二个元素开始(目的是默认),每次先将新元素放入第0个位置,然后和当前有序序列的最后一个元素进行比较,若大于等于就保持原位不动,若小于就开始向前移动不断比较直到找到一个小于的位置或者到达位置0为止。
直接插入排序的开销主要体现在数据的比较和移动次数上,本人数学功底不好,就不讨论性能了,直接上代码,截图。
const int iCount = 9;
int iRawBuff[iCount] = {0,49,38,65,97,76,13,27,49};
int DirectInsertSort()
{
for (int i = 2;i < iCount;i++)
{
iRawBuff[0] = iRawBuff[i];
int j = i-1;
while (iRawBuff[0] < iRawBuff[j])
{
iRawBuff[j+1] = iRawBuff[j];
j--;
}
iRawBuff[j+1] = iRawBuff[0];
//std::cout<<"第:"<<(i-1)<<std::endl;
printf("第%d趟:\n",i-1);
for(int k = 0; k < iCount; k++)
{
std::cout<<iRawBuff[k]<<"\t";
}
std::cout<<std::endl;
}
return 0;
}
今天突然想到,while(iRawBuff[0]<iRawBuff[j])这句应该在加一个限定j是大于等于零的,如果超过了界限,就没有意义了。
脑子里突然闪了一下,不用这样做,为什么呢?iRawBuff[[0],的值和他相等,所以到了0处还没满足的话肯定要跳出循环的,哨兵的意义很大程度也在于此了,哈哈 不错,2b的我今天有收获