昨天晚上写好了归并排序的算法,后来就趁热打铁,开始写快速排序算法,代码是越写越熟练,越写越来劲。昨天晚上也就写出来了快速排序算法。
但是在我测试的时候先后出现一些问题:
第一个问题:
1)输入 1 2 3 4 5 6 7 -1时,排序结果2 1 5 6 7 3什么什么的,但是输入8 7 6 5 4 3 2 1 -1时,倒是能排得好好的。天哪,脑袋记不清了,,,我竟然忘了我修改那个地方了,,,真是悲催。我把它修改好了。(应该是修改了,分成两段的过程中,数组小标大小的限时,之前应该没有加左边的下标小于右边的下标)
while(array[n1]<array[p]&&n1<=n2)
n1++;
while(array[n2]>array[p]&&n2>=n1)
n2--;
现在好了,不管输入1 2 3 还是 3 2 1 还是2 3 1等,都能很对得输出。其实还有个bug,我先上代码,然后接着写。
#include<iostream>
using namespace std;
int vector_initial(int *array);
void vector_print(int *array,int n);
void fast_sort(int *array,int p,int r);
int separate_2part(int *array,int p,int r);
int main()
{
int a[100];
int n;
n=vector_initial(a);
fast_sort(a,0,n);
vector_print(a,n);
return 0;
}
int vector_initial(int *array)
{ int i=0;
cin>>array[i];
while(array[i]!=-1)
{
i++;
cin>>array[i];
}
return i-1;
}
void vector_print(int *array,int n)
{
if(array[0]==-1)
return;
for(int i=0;i<=n-1;i++)
cout<<array[i]<<" ";
cout<<array[n]<<endl;
}
void fast_sort(int *array,int p,int r)
{
int v,tempdata;
if(r>p)
{
v=separate_2part(array,p,r);
fast_sort(array,p,v-1);
fast_sort(array,v+1,r);
}
}
int separate_2part(int *array,int p,int r)
{
int n1,n2,tempdata;
n1=p;
n2=r;
while(n2>n1)
{
while(array[n1]<array[p]&&n1<=n2)
n1++;
while(array[n2]>array[p]&&n2>=n1)
n2--;
if(n1!=n2)
{
tempdata=array[n1];
array[n1]=array[n2];
array[n2]=tempdata;
}
else
{
tempdata=array[p];
for(int i=p+1;i<=n1;i++)
{
array[i-1]=array[i];
}
array[n1]=tempdata;
}
}
return n2;
}
现在的问题是:
不能输入两个相同的数,一旦输入的数组中,有两个或多个相同时,程序就进入死循环。我昨晚调试了,单步跟踪到
int separate_2part(int *array,int p,int r)这个函数里,在下面这个循环里出不来了:
while(n2>n1)
{
while(array[n1]<array[p]&&n1<=n2)
n1++;
while(array[n2]>array[p]&&n2>=n1)
n2--;
if(n1!=n2)
{
tempdata=array[n1];
array[n1]=array[n2];
array[n2]=tempdata;
}
else
{
tempdata=array[p];
for(int i=p+1;i<=n1;i++)
{
array[i-1]=array[i];
}
array[n1]=tempdata;
}
}
最后,始终是~~~~~始终是~是n2比n1大,我忘了到底是大1还是大2了,,我先把代码贴上,我写会儿作业,晚上接着搞!