帮忙看个【C++】【递归快速排序】代码
麻烦帮忙看下这代码错哪了、我用现在这些数排序出问题、而用int i,a[M]={49,38,65,97,76,13,27,49};这段代码、并把M改成 8,排序又是正确的、这是为什么呢?麻烦帮忙看看、谢谢啊!
#include<stdio.h>
#define M 5
void QuickSort(int a[],int head,int tail){
int i,s,tem,h=head,t=tail;
s=a[h];
if(tail<=head) return ;
while(h!=t){
for(i=h;i<=t;i++){
if(a[t]<s){
tem=a[t];
a[t]=a[h];
a[h]=tem;
break;
}
else t--;
}
for(i=h;i<=t;i++){
if(a[h]>=s){
tem=a[h];
a[h]=a[t];
a[t]=tem;
break;
}
else
h++;
}
}
//a[h]=s;
QuickSort(a,head,h-1);
QuickSort(a,h+1,tail);
}
int main(){
//int i,a[M]={49,38,65,97,76,13,27,49};
int i,a[M]={4,5,9,8,1};
printf("原数为:");
for(i=0;i<M;i++)
printf("%d ",a[i]);
QuickSort(a,0,7);
printf("\n排序后:");
for(i=0;i<M;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
[解决办法]
算法实现不标准,参考《算法导论》
[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
[解决办法]
楼主可以尝试着不要在找位置的时候换元素。导致你的这个位置最后找的不一定准确了。
[解决办法]
算法有错吧,8的时候是碰巧,我试着改了下,你看看
#include<stdio.h>#define M 5void QuickSort(int a[],int head,int tail){ int i,s,tem,h=head,t=tail; s=a[h]; if(tail<=head) return ; while(h!=t){ while(h<t){ if(a[t]<s){ //tem=a[t]; //a[t]=a[h]; //a[h]=tem; a[h++]=a[t]; break; } else t--; } while(h<t){ if(a[h]>=s){ a[t--]=a[h]; break; } else h++; } } a[h]=s;//需要 QuickSort(a,head,h-1); QuickSort(a,h+1,tail);}int main(){// int i,a[M]={49,38,65,97,76,13,27,49};int i,a[M]={4,5,9,8,1};printf("原数为:");for(i=0;i<M;i++)printf("%d ",a[i]);QuickSort(a,0,M-1);//printf("\n排序后:");for(i=0;i<M;i++)printf("%d ",a[i]);printf("\n");return 0;}