我正在用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()
来跟踪值,这是问题所在,
i的值是26,j的值是137.现在我的问题是,自i<j
以来,为什么i的值递增并且j递减?
do-while
循环正在运行,但为什么值不会发生变化。有什么想法吗?
答案 0 :(得分:1)
Partition
中的这段代码存在缺陷。
if(i<j)
{
int temp=master[i];
master[i]=master[j];
master[j]=temp;
}
如果pivot == master[i] == master[j]
,该程序将永远运行。