插入排序算法?

zero_226 2010-06-30 07:06:49
void insertSort(int*a, int n)
{
for(int i = 1; i < n; i++)
{
int temp = a[i];
for(int j = 0;(j < i) && (a[j] > temp); j++)
{
a[j + 1] = a[j];
}
a[j] = temp;
}
}
求大家帮我看下这段算法的问题在哪里,我觉得逻辑挺对的啊。
帮帮忙啊,同志们
...全文
86 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zero_226 2010-06-30
  • 打赏
  • 举报
回复
非常感谢冒险王以及各位!
lizhi200404520 2010-06-30
  • 打赏
  • 举报
回复
void insertSort(int*a, int n)
{
for(int i = 1; i < n; i++)
{
int temp = a[i];
for(int j = i;(j > 0) && (a[j-1] > temp); j--)
{
a[j ] = a[j-1];
}
a[j] = temp;
}

}
adventurelw 2010-06-30
  • 打赏
  • 举报
回复
因为a[j+1]并没有被保存啊,你给他赋了新值,旧值肯定就没了。
但从后往前的话,因为a[0, i - 1]这个序列是已经排好序的,所以a[i-1]肯定是最大的,如果这个序列有大于a[i]也即temp的数据,a[i-1]一定大于temp,那么在循环的第一步就会进行向后的移位,将a[i-1](即a[j])移到a[i](即a[j+1]),因为a[i]已经通过temp保存了,所以被覆盖了也没有关系,这样就保证了a[j](也即可能被往后移的元素)的后一位元素都提前被另存了,自然不用担心覆盖的问题了。
zero_226 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 adventurelw 的回复:]

从前往后
你会导致一旦进行移位也就是这一步:a[j+1]=a[j]的a[j+1]的真实数据比覆盖啊。
[/Quote]
你说的很对,我今天调试的时候就是这样,但我还是不明白,怎么会被覆盖的,我是找着该移位的那个数据时才开始往后移动的,它是怎么被覆盖的?
请您指教一下
tan625747 2010-06-30
  • 打赏
  • 举报
回复
学习了
adventurelw 2010-06-30
  • 打赏
  • 举报
回复
从前往后
你会导致一旦进行移位也就是这一步:a[j+1]=a[j]的a[j+1]的真实数据比覆盖啊。
zero_226 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 adventurelw 的回复:]

for(int j = 0;(j < i) && (a[j] > temp); j++)
{
a[j + 1] = a[j];
}

应该是
for(int j = i - 1; (j >= 0) && (a[j] > temp); --j)
{
a[j + 1] = a[j];
}
吧。
[/Quote]
你说的这个很对,但我觉得我那个也行啊,一个是从前往后比,一个是从后往前比
太乙 2010-06-30
  • 打赏
  • 举报
回复
for(i=1;i<n;i++)
{
x=A[i];
for(j=i-1;j>=0;j--)
if(x<A[j])
A[j+1]=A[j];
else
break;
A[j+1]=x;
}
太乙 2010-06-30
  • 打赏
  • 举报
回复
这个是插入排序??

插入排序应该是对已排好序的吧?
cattycat 2010-06-30
  • 打赏
  • 举报
回复
第二个for循环for(int j=i;j>0 && a[j]>temp ;j--)
adventurelw 2010-06-30
  • 打赏
  • 举报
回复
for(int j = 0;(j < i) && (a[j] > temp); j++)
{
a[j + 1] = a[j];
}

应该是
for(int j = i - 1; (j >= 0) && (a[j] > temp); --j)
{
a[j + 1] = a[j];
}
吧。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧