主题:快速排序算法中,递归传递值的一个疑惑!
#include<stdio.h>
#define MAXSIZE 10
typedef int KeyType;
typedef struct
{
KeyType key;
}RecType;
typedef struct
{
RecType r[MAXSIZE+1];
int length;
}Sortlist;
main()
{
Sortlist S;
int x,i=1;
S.length=0;
printf("please input numbers(int),space out by 'space',exit for '0':\n");
scanf("%d",&x);
while(x!=0&&i<MAXSIZE+1)
{
S.r[i].key=x;
S.length++;
i++;
scanf("%d",&x);
}
printf("\n");
printf("---------------------------\n");
printf("1--Direct Sort\n");
printf("2--Shell Sort\n");
printf("3--Quick Sort\n");
printf("4--Selection Sort\n");
printf("5--Stack Sort\n");
printf("6--Two Path Sort\n");
printf("---------------------------\n");
printf("\n");
printf("The numbers are:");
for(i=1;i<=S.length;i++)
{
printf("%4d",S.r[i].key);
}
printf("\n");
printf("length=%d",S.length);
printf("\n");
quicksort(&S,1,S.length);
rear(S);
getch();
}
quicksort(Sortlist *L,int low,int high)
{
/* 快速排序算法 */
int i,j;
if(low<high)
{
i=low;j=high;
L->r[0]=L->r[i];
while(i<j)
{
while(i<j&&L->r[j].key>=L->r[0].key) j--;
L->r[i]=L->r[j];
while(i<j&&L->r[i].key<=L->r[0].key) i++;
L->r[j]=L->r[i];
}
L->r[i]=L->r[0];
quicksort(L,low,i-1);
quicksort(L,i+1,high);
}
}
rear(Sortlist L)
{
int i;
for(i=1;i<=L.length;i++)
{
printf("%3d",L.r[i].key);
}
}
在递归部分,主函数传递的时候是以地址传递给算法的!
quicksort(&S,1,S.length);
但是在算法中的递归部分的传递形式
quicksort(L,low,i-1);
一个是&S,一个是L!但是算法接收的参数为quicksort(Sortlist *L,....
这里是*L,按道理说应该是按地址传递吧?
但是如果在两个递归中用quick(&L,low,i-1);quick(&L,i+1,high);这样进行编译后就出现警告提示:指针在编译后指向其他类型。运行后发现根本没有进行任何的排序,数按原输入顺序输出!
这个是什么问题啊?
#define MAXSIZE 10
typedef int KeyType;
typedef struct
{
KeyType key;
}RecType;
typedef struct
{
RecType r[MAXSIZE+1];
int length;
}Sortlist;
main()
{
Sortlist S;
int x,i=1;
S.length=0;
printf("please input numbers(int),space out by 'space',exit for '0':\n");
scanf("%d",&x);
while(x!=0&&i<MAXSIZE+1)
{
S.r[i].key=x;
S.length++;
i++;
scanf("%d",&x);
}
printf("\n");
printf("---------------------------\n");
printf("1--Direct Sort\n");
printf("2--Shell Sort\n");
printf("3--Quick Sort\n");
printf("4--Selection Sort\n");
printf("5--Stack Sort\n");
printf("6--Two Path Sort\n");
printf("---------------------------\n");
printf("\n");
printf("The numbers are:");
for(i=1;i<=S.length;i++)
{
printf("%4d",S.r[i].key);
}
printf("\n");
printf("length=%d",S.length);
printf("\n");
quicksort(&S,1,S.length);
rear(S);
getch();
}
quicksort(Sortlist *L,int low,int high)
{
/* 快速排序算法 */
int i,j;
if(low<high)
{
i=low;j=high;
L->r[0]=L->r[i];
while(i<j)
{
while(i<j&&L->r[j].key>=L->r[0].key) j--;
L->r[i]=L->r[j];
while(i<j&&L->r[i].key<=L->r[0].key) i++;
L->r[j]=L->r[i];
}
L->r[i]=L->r[0];
quicksort(L,low,i-1);
quicksort(L,i+1,high);
}
}
rear(Sortlist L)
{
int i;
for(i=1;i<=L.length;i++)
{
printf("%3d",L.r[i].key);
}
}
在递归部分,主函数传递的时候是以地址传递给算法的!
quicksort(&S,1,S.length);
但是在算法中的递归部分的传递形式
quicksort(L,low,i-1);
一个是&S,一个是L!但是算法接收的参数为quicksort(Sortlist *L,....
这里是*L,按道理说应该是按地址传递吧?
但是如果在两个递归中用quick(&L,low,i-1);quick(&L,i+1,high);这样进行编译后就出现警告提示:指针在编译后指向其他类型。运行后发现根本没有进行任何的排序,数按原输入顺序输出!
这个是什么问题啊?