回 帖 发 新 帖 刷新版面

主题:快速排序算法中,递归传递值的一个疑惑!

#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);这样进行编译后就出现警告提示:指针在编译后指向其他类型。运行后发现根本没有进行任何的排序,数按原输入顺序输出!
这个是什么问题啊?

回复列表 (共1个回复)

沙发

已经解决
是因为递归中l本身已经是指针
如果还取地址最后就是指向指针的指针,就出错了

我来回复

您尚未登录,请登录后再回复。点此登录或注册