首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

帮忙看个【C++】【递归快速排序】代码解决方案

2012-06-12 
帮忙看个【C++】【递归快速排序】代码麻烦帮忙看下这代码错哪了、我用现在这些数排序出问题、而用int i,a[M]{49

帮忙看个【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的时候是碰巧,我试着改了下,你看看

C/C++ code
#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;} 

热点排行