找不到此Quicksort代码的问题

时间:2014-09-18 06:15:51

标签: c++

我正在用C ++编写快速排序代码。当我为小数组运行代码时,代码工作得非常好但是当元素数量很大时我遇到了问题,比如450.

我的代码如下所示:(使用Visual Studio):

// algo_QuickSort.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<stdio.h>
#include<iostream>
#include<conio.h>
#include<limits.h>
#include<time.h>
using namespace std;



int Partition(int master[6],int beg,int end)
{
    cout<<"entered partition..";
    int pivot=master[beg];
    int i=beg+1,j=end;
    do
    {
        for(;master[i]<pivot;)
        {
            i++;
        }

        for(;master[j]>pivot;)
        {
            j--;
        }

        if(i<j)
        {
            int temp=master[i];
            master[i]=master[j];
            master[j]=temp;

        }

        cout<<"i: "<<i<<endl;
        cout<<"j: "<<j<<endl;
        _getch();
    }while(i<j);
    _getch();
    cout<<"exited while..";
    if(i>=j)
    {
        int temp2=master[j];
        master[j]=pivot;
        master[beg]=temp2;
        cout<<"before return..";
        return j;
    }
}


void QuickSort(int master[10001],int beg,int end)
{
    cout<<"entered quicksort..";
    if(beg<end)
    {
        int flag=Partition(master,beg,end);

        QuickSort(master,beg,flag);
        QuickSort(master,flag+1,end);
    }
}




int _tmain(int argc, _TCHAR* argv[])
{
    int A[10001];
    clock_t start,end;

    /*int A[6]={7,5,8,3,2};
    A[5]=numeric_limits<int>::max();

    QuickSort(A,0,5);

    for(int i=0;i<5;i++)
        cout<<A[i]<<" ";*/
    for(int i=450;i<=10001;i+=450)
    {
        //cout<<"entered loop..";
        for(int j=0;j<i;j++)
        {
            A[j]=rand()%i;
        }

        A[i]=numeric_limits<int>::max();


        cout<<"here..";
        start=clock();

        QuickSort(A,0,i);
        //cout<<"out of qs..";
        end=clock();

        cout<<i<<","<<(double)(end-start)/CLK_TCK<<endl;
    }




    return 0;
}

在这里你可以看到,在main函数中注释掉的部分是代码运行绝对正常的测试用例,以升序打印数字。 但是当我为大数字运行代码时,它会陷入某种循环所以我编写了各种cout_getch()来跟踪值,这是问题所在, enter image description here

i的值是26,j的值是137.现在我的问题是,自i<j以来,为什么i的值递增并且j递减? do-while循环正在运行,但为什么值不会发生变化。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Partition中的这段代码存在缺陷。

    if(i<j)
    {
        int temp=master[i];
        master[i]=master[j];
        master[j]=temp;
    }

如果pivot == master[i] == master[j],该程序将永远运行。