打印
[C语言]

c语言if的问题

[复制链接]
1470|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanghelovehuang|  楼主 | 2018-7-23 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简单的快速排序函数,代码不长,求大神看下。我就是想问,这段代码是正常的,但是如果去掉if判断就会出现段错误,为什么啊,main的传参已经很明确了left小于right,为什么还非要加个判断呢?不加判断时的段错误是是吗原因造成的呢?
void quick_sort(int *a, int left, int right)
{
        if(left < right)
        {
                int i = left;
                int j = right;
                int key = a[left];

                while(i < j)
                {
                        while(a[j] > key && i < j)
                        {
                                j--;
                        }

                        if(i < j)
                                a[i++] = a[j];

                        while(a[i] < key && i < j)
                        {
                                i++;
                        }

                        if(i < j)
                                a[j--] = a[i];
                }
                a[i] = key;
                quick_sort(a, left, i - 1);
                quick_sort(a, i + 1, right);
        }

}

int main(int argc, char const *argv[])
{
        int a[] = {63,54,1,76,44,77,90,43,3,7,8};

        int len = sizeof(a)/sizeof(int);
        int i;

        quick_sort(a, 0, len);
        for(i = 0; i < len; i++)
        {
                printf("%d ", a[i]);
        }

        return 0;
}

相关帖子

沙发
airwill| | 2018-7-23 19:35 | 只看该作者
quick_sort()  函数里有迭代调用.

你的 main() 里调用的时候, 是保证 left < rigth 的
但在 quick_sort() 调用的就保不准咯

使用特权

评论回复
板凳
linqing171| | 2018-7-23 21:08 | 只看该作者
                quick_sort(a, left, i - 1);
                quick_sort(a, i + 1, right);

你看看只有两个值的时候

这两个参数会相等。没有
做个判断只是一句,如果都执行到while才退出会慢。

使用特权

评论回复
地板
QuakeGod| | 2018-7-23 23:14 | 只看该作者
你这个程序上来就数组越界了。

使用特权

评论回复
5
jeffupright| | 2018-7-23 23:39 | 只看该作者
没有这个if语句,int key = a[left]可能超边界了

使用特权

评论回复
6
jeffupright| | 2018-7-23 23:50 | 只看该作者
首先是你的形参超出数组边界了,是你敲键盘少敲了么,应该是quick_sort(a, 0, len-1);

其次,你这个if条件不能去掉,否则递推调用的时候,可能就不行了哦,如一楼所说

使用特权

评论回复
7
yanghelovehuang|  楼主 | 2018-7-24 09:58 | 只看该作者
airwill 发表于 2018-7-23 19:35
quick_sort()  函数里有迭代调用.

你的 main() 里调用的时候, 是保证 left < rigth 的

大神 请问下, 不是main函数的传参已经确定left == 0 right == len了吗,经过while的计算确定i在数组中间肯定小于len大于0啊。为什么还不确定呢?

使用特权

评论回复
8
airwill| | 2018-7-24 10:14 | 只看该作者
递归调用, 看看函数里面最后两语句
                quick_sort(a, left, i - 1);
                quick_sort(a, i + 1, right);
每次调用, i 都在变.

所以不能保证每次 left< i - 1;   i + 1< right.
就是楼上有人提到的, 这判断其实是数组越界的条件.

使用特权

评论回复
9
yanghelovehuang|  楼主 | 2018-7-24 10:21 | 只看该作者
airwill 发表于 2018-7-24 10:14
递归调用, 看看函数里面最后两语句
                quick_sort(a, left, i - 1);
                quick_s ...

您好 关于数组越界还是不太明白,麻烦能举出这个程序越界的一种现象吗?a[]没定义数组大小程序自动分配不是不存在越界吗, 麻烦您了 新手

使用特权

评论回复
10
airwill| | 2018-7-24 10:44 | 只看该作者
你还是找点书看吧

使用特权

评论回复
11
yanghelovehuang|  楼主 | 2018-7-24 16:09 | 只看该作者
airwill 发表于 2018-7-24 10:44
你还是找点书看吧

好吧 谢谢啊

使用特权

评论回复
12
一叶倾城wwq| | 2018-7-24 21:59 | 只看该作者
你的编译器很厉害啊,能定义动态数组?分配是都是得有具体大小的

使用特权

评论回复
13
一路向北lm| | 2018-7-26 07:02 | 只看该作者
不要用这么多while

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

324

帖子

1

粉丝