为什么直接插入排序是稳定的??

anison 2008-10-27 08:57:47

// 直接插入排序
const int iSize=10;
// 第一个不保存元素
int a[iSize+1]={0,11,46,79,21,2,32,99,12,54,63};
int j;

for(int i=2;i<=iSize;i++)
{
j=i-1;
a[0]=a[i];
while(a[j]>=a[0]) // 书上这里是a[j]>a[0],所以是稳定的,可是这里为什么不能要等号呢?
{
a[j+1]=a[j];
j--;
}
a[j+1]=a[0];
}
...全文
1713 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
CoderPlusPlus 2008-10-28
  • 打赏
  • 举报
回复
不用等号保证了稳定,但不用等号并不是稳定的根本原因,你跟希尔排序对比一下就知道了,希尔排序不管你用不用等号,都不能做到稳定的,所以稳定是算法本身的特征,这里不用等号仅仅是把它本身的稳定性发挥出来,而不是因为不用等号所以稳定,因果关系要搞清楚
elephont9527 2008-10-28
  • 打赏
  • 举报
回复
j=-1导致越界这是程序问题

排序算法是否稳定取决于相等得数是否会交换顺序,如果用>=,相等得数就会交换顺序,所以就不是稳定的算法了
用>,就保证了相等得数不会交换顺序,明白?
wzyzb 2008-10-28
  • 打赏
  • 举报
回复
while(a[j]>=a[0]) // 这里j 会=-1 有危险
{
a[j+1]=a[j];
j--;
}
wzyzb 2008-10-28
  • 打赏
  • 举报
回复
while(a[j]>=a[0]) // 这里j 会=-1 有危险
{
a[j+1]=a[j];
j--;
}
liumingrong 2008-10-27
  • 打赏
  • 举报
回复
加等号就叫anison排序了
[Quote=引用 9 楼 Sangle 的回复:]
引用 6 楼 anison 的回复:
这个..我了解是否稳定的意思,我是说为什么直接插入排序时那关键的一步不加等号>=
如果加了等号就是不稳定的了

其实应该是先后的顺序的问题,如果确定直接插入排序是稳定-->所以不能要等号,但是为什么开始确定直接插入排序是稳定的呢??


插入排序是不加等号的!,所以它是稳定的。
[/Quote]
开心爸爸84 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 anison 的回复:]
这个..我了解是否稳定的意思,我是说为什么直接插入排序时那关键的一步不加等号>=
如果加了等号就是不稳定的了

其实应该是先后的顺序的问题,如果确定直接插入排序是稳定-->所以不能要等号,但是为什么开始确定直接插入排序是稳定的呢??
[/Quote]

插入排序是不加等号的!,所以它是稳定的。
aidingbao1019 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Sangle 的回复:]

举个例子吧,
{0,11,9,11};

如果加上等号,排序后是这样
{0,9,11, 11 }

而稳定的应该是这样
{0,9,11,11}
[/Quote]
同意!
冻结 2008-10-27
  • 打赏
  • 举报
回复
稳定排序就是两个相同元素,在排序后前后没发生变化!
anison 2008-10-27
  • 打赏
  • 举报
回复
这个..我了解是否稳定的意思,我是说为什么直接插入排序时那关键的一步不加等号>=
如果加了等号就是不稳定的了

其实应该是先后的顺序的问题,如果确定直接插入排序是稳定-->所以不能要等号,但是为什么开始确定直接插入排序是稳定的呢??
开心爸爸84 2008-10-27
  • 打赏
  • 举报
回复
注意, 这两个11 是有区别的,如果是这样的数组
{0,'a'}, {11, 'b'}, {9, 'c'}, {11, 'c'},
按照第一个关键字排序,结果就改变了原来的相对次序

{0,'a'}, {9, 'c'}, {11, 'c'},{11, 'b'}

按照原来的{11, 'b'} 应该在{11, 'c'}
wuyu637 2008-10-27
  • 打赏
  • 举报
回复
排序稳定就是指,如果2个数相等的时候,排序后不会影响它们原来的顺序。


如果你说的那里加上=号,那么当2个数字相等的时候,也可能造成2个数的位置的交换,从而改变原来的顺序。
luxiaoxun 2008-10-27
  • 打赏
  • 举报
回复
加等号就不是稳定的了 相等的也向后移了
开心爸爸84 2008-10-27
  • 打赏
  • 举报
回复

举个例子吧,
{0,11,9,11};

如果加上等号,排序后是这样
{0,9,11, 11 }

而稳定的应该是这样
{0,9,11, 11 }
lzp765 2008-10-27
  • 打赏
  • 举报
回复
不懂,顶下

65,211

社区成员

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

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