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

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

清晨说ぺ晚安 发布于 2017-01-07 字数 799 浏览 991 回复 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);
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

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

评论(3

归属感 2017-10-18 3 楼
#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 2 楼

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

甜柠檬 2017-03-21 1 楼

我在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执行失败,修改之后输出结果是正确的,与你所说不一样。