鱼C论坛

 找回密码
 立即注册
查看: 2312|回复: 12

求答疑:插入排序

[复制链接]
发表于 2016-6-1 12:19:06 | 显示全部楼层 |阅读模式
10鱼币
如题,为什么加了注释的和没加的会有差别?!Windows下没有称手的调试工具,求请教!
  1. #include <stdio.h>

  2. int arr[101],n;

  3. void insert_sort(int len)
  4. {
  5.         int i, j, t;
  6.        
  7.         for (i=1; i<len; i++)
  8.         {
  9.                 t = arr[i];
  10. //                for (j=i-1; j>=0&&arr[j]>t; j--)
  11.                 for (j=i-1; j>=0&&arr[j]>arr[i]; j--)
  12.                 {
  13.                         arr[j+1] = arr[j];
  14.                 }
  15. //                arr[j+1] = t;
  16.                 arr[j+1] = arr[i];
  17.         }
  18. }

  19. int main()
  20. {
  21.         int i, j;
  22.        
  23.         scanf("%d", &n);
  24.         for (i=0; i<n; i++)
  25.                 scanf("%d", &arr[i]);
  26.        
  27.         insert_sort(n);
  28.        
  29.         //print
  30.         for (i=0; i<n; i++)
  31.                 printf("%d ", arr[i]);
  32.                
  33.         getchar(); getchar();
  34.        
  35.         return 0;
  36. }
复制代码

最佳答案

查看完整内容

是的呀,j 对 i 没影响。 但是arr[j] 会对 arr 有影响。因为 j 的变化范围与 i 的值有交集。 for循环第一步,j = i - 1; arr[j+1] 这个不就是 arr 吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 12:19:07 | 显示全部楼层
~风介~ 发表于 2016-6-1 14:17
虽然j是由i赋初始值的,但是j变化对i没什么影响吧。


是的呀,j 对 i 没影响。

但是arr[j] 会对 arr[i] 有影响。因为 j 的变化范围与 i 的值有交集。

for循环第一步,j = i - 1;
arr[j+1] 这个不就是 arr[i] 吗?

点评

我很赞同!: 5.0
我很赞同!: 5
谢了!:)  发表于 2016-6-1 20:10
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 13:08:49 | 显示全部楼层

1. 如果使用t,那它肯定忠心耿耿,不会改变。

2. 如果使用arr[i],毕竟 j 从 i-1 开始,而 arr[j+1] 也就有机会挖墙脚,arr[i] 被修改了,结果也就错了。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-1 14:17:19 | 显示全部楼层
n0noper 发表于 2016-6-1 13:08
1. 如果使用t,那它肯定忠心耿耿,不会改变。

2. 如果使用arr,毕竟 j 从 i-1 开始,而 arr[j+1] 也就 ...

虽然j是由i赋初始值的,但是j变化对i没什么影响吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 21:09:17 | 显示全部楼层
//看我的图  蓝色那行(被框起来的)
/*我原本输入的测试数据是 1,4,7,0,-5
  执行第三次循环时(就是图中那次循环)看左边变量窗口
  arr 变成了 1,4,7,7,-5
  这是正常的变化
  但下一步本应该将原本的key (数据中的0)赋值给arr[2]
  但很明显,如果使用  arr[j+1] = arr[i]  就会出错!
  因为此时 i = 3 (看左边变量窗口)
  即你将原本应执行的 0 -> 7 ,变成了 7 -> 7 故错在这一步
  -------------小分割-----------------
  原因我想你应该知道了
  就是for循环中的赋值改变了本应该保存起来的‘插入元素’
  即此刻的 a[i] 已非当年 的 a[i]
*/
DDOTC56UJQ}BR0XEVHC8MEU.png

评分

参与人数 1荣誉 +3 鱼币 +10 收起 理由
~风介~ + 3 + 10 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 21:12:16 | 显示全部楼层
什么 居然已经解决了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 21:52:54 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 22:57:58 | 显示全部楼层
插入排序。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-2 20:46:43 | 显示全部楼层
Looker 发表于 2016-6-1 21:09
//看我的图  蓝色那行(被框起来的)
/*我原本输入的测试数据是 1,4,7,0,-5
  执行第三次循环时(就 ...

我的Dev-C++一调出debug就崩溃!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-2 22:56:26 | 显示全部楼层
~风介~ 发表于 2016-6-2 20:46
我的Dev-C++一调出debug就崩溃!

本来想把安装包发给你的,附件不能超过1m。。。
可以去官网重新下载一个
https://sourceforge.net/projects/dev-cpp/
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-3 01:17:43 | 显示全部楼层
Looker 发表于 2016-6-2 22:56
本来想把安装包发给你的,附件不能超过1m。。。
可以去官网重新下载一个
https://sourceforge.net/proj ...

谢了!:)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-9 14:05:54 | 显示全部楼层
~风介~ 发表于 2016-6-2 20:46
我的Dev-C++一调出debug就崩溃!

我也是诶,不知道为什么
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-17 13:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表