鱼C论坛

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

求答疑:插入排序

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

int arr[101],n;

void insert_sort(int len) 
{
        int i, j, t;
        
        for (i=1; i<len; i++)
        {
                t = arr[i];
//                for (j=i-1; j>=0&&arr[j]>t; j--)
                for (j=i-1; j>=0&&arr[j]>arr[i]; j--)
                {
                        arr[j+1] = arr[j];
                }
//                arr[j+1] = t;
                arr[j+1] = arr[i];
        }
}

int main()
{
        int i, j;
        
        scanf("%d", &n);
        for (i=0; i<n; i++) 
                scanf("%d", &arr[i]);
        
        insert_sort(n);
        
        //print
        for (i=0; i<n; i++)
                printf("%d ", arr[i]);
                
        getchar(); getchar();
        
        return 0;
} 

最佳答案

查看完整内容

是的呀,j 对 i 没影响。 但是arr[j] 会对 arr 有影响。因为 j 的变化范围与 i 的值有交集。 for循环第一步,j = i - 1; arr[j+1] 这个不就是 arr 吗?
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

想知道小甲鱼最近在做啥?请访问 -> 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没什么影响吧。
想知道小甲鱼最近在做啥?请访问 -> 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 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 21:12:16 | 显示全部楼层
什么 居然已经解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 21:52:54 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-1 22:57:58 | 显示全部楼层
插入排序。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

我的Dev-C++一调出debug就崩溃!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

谢了!:)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

我也是诶,不知道为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 02:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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