C++-关于快速排序的一个C语言问题

发布于 2017-01-07 22:09:41 字数 791 浏览 1110 评论 3

请看如下这个问题

void print(int *a, int len)
{
for(int i = 0; i < len; i++)
cout << a[i] << ' ';
cout << endl;
}

void quickSort(int *a, int first, int last)
{
if(first >= last)
return ;

int pos = a[last];
int j;
for(int i = first, j = first; i < last; i++)
{
if(a[i] <= pos)
swap(a[i], a[j++]);
}
cout << "j = " << j << endl;
swap(a[j], a[last]);
print(a, last - first + 1);
}

int main()
{
int b[] = {1, 5, 2, 4, 3};
int len_b = sizeof b / sizeof b[0];
quickSort(b, 0, len_b - 1);
print(b, len_b);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

归属感 2017-10-18 02:31:31
#include <iostream>
using namespace std;

void print(int *a, int len)
{
    for(int i = 0; i < len; i++)
     cout << a[i] << ' ';
    cout << endl;
}

void quickSort(int *a, int first, int last)
{
    if(first >= last)
        return;

    int pos = a[last];
    int j;                                //这里声明了j但是未初始化
//  int i;
        //for里i前加了int表示声明了局部变量i和j,初值是first,这个仅仅是for局部变量,跟上面的j无关
    for(int i = first , j = first; i < last; i++)
    {
        if(a[i] <= pos)
            swap(a[i], a[j++]);
    }
    //所以出了for后j还是一个未初始化的值
    cout << "j = " << j << endl;
    swap(a[j], a[last]);
    print(a, last - first + 1);
}

int main()
{
    int b[] = {1, 5, 2, 4, 3};
    int len_b = sizeof b / sizeof b[0];
    quickSort(b, 0, len_b - 1);
    print(b, len_b);
    return 0;
}

如果你把for里面的int放到外面,那上面声明的i和j才是初始化为first!
所以改后输出才没问题,改前编译就会有warning的啊..

编译成功,1个warning,就是上面说的j的问题!

泛泛之交 2017-03-29 21:58:07

完全可以 工程完全没有声明全局变量j
或许真是人品问题 vs2010 没问题

甜柠檬 2017-03-21 07:37:51

我在VS2008里面跑了一下你的代码,发现了一个问题:

 int j;
for(int i = first, j = first; i < last; i++)
{
if(a[i] <= pos)
swap(a[i], a[j++]);
}
cout << "j = " << j << endl;

这段代码在VS2008里会由于定义的问题导致cout执行失败,修改之后输出结果是正确的,与你所说不一样。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文