昨天晚上写好了归并排序的算法,后来就趁热打铁,开始写快速排序算法,代码是越写越熟练,越写越来劲。昨天晚上也就写出来了快速排序算法。
但是在我测试的时候先后出现一些问题:
第一个问题:
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了,,我先把代码贴上,我写会儿作业,晚上接着搞!
时间: 2024-10-10 22:08:06