QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 760|回复: 7

关于快速排序问题

[复制链接]
发表于 2004-11-28 17:16:21 | 显示全部楼层 |阅读模式
编译完出现以下错误:
[code:1]
send.c: In function `QuickSort':
send.c:83: warning: passing arg 1 of `QuickPass' from incompatible pointer type
send.c:84: warning: passing arg 1 of `QuickSort' from incompatible pointer type
send.c:85: warning: passing arg 1 of `QuickSort' from incompatible pointer type
[/code:1]
该如何改呢??

[code:1]
/*
**QuickSort
*/
#include <stdio.h>
#include <stdlib.h>
#define maxsize 20

typedef struct reclist
{
  int key;
} records;

typedef struct table
{
  records item[maxsize + 1];
  int last;
} sqtable;

int CreateSqtable (sqtable *R)
{
  int input;
  int count = 1;
  R -> last = 0;

  printf("Input Some data(0 to end):");
  scanf("%d", &input);

  while (input)
    {
      R -> item[count].key = input;
      R -> last++;
      count++;
      scanf("%d", &input);
    }
  return 1;
}

int PrintSqtable (sqtable *R)
{
  int i;

  printf("list:\n");
  for (i = 1; i <= R -> last; i++)
    printf("(%d):%d ", i, R -> item[i].key);
  printf("\n");
  return 1;
}

/*QuickPass*/
int QuickPass (sqtable *R, int low, int high)
{
  int pivotkey;

  pivotkey = R -> item[low].key;

  while (low < high)
    {
      while ((low < high) && (R -> item[high].key >= pivotkey))
        high--;
      if (low < high)
        {
          R -> item[low].key = R -> item[high].key;
          low++;
        }
     
      while ((low < high) && (R -> item[low].key <= pivotkey))
        low++;
      if (low < high)
        {
          R -> item[high].key = R -> item[low].key;
          high--;
        }
    }
  R -> item[low].key = pivotkey;
  return (low);
}

int QuickSort (sqtable *R, int low, int high)
{
  int pivotloc;
  if (low < high)
    {
      pivotloc = QuickPass (&R, low, high);  
      QuickSort (&R, low, pivotloc - 1);
      QuickSort (&R, pivotloc + 1, high);
    }
  return 1;
}


int main (void)
{
  sqtable R;
  int choose;
  int low, high;

  CreateSqtable (&R);
  printf("\nBefore,");
  PrintSqtable (&R);

  while (1)
    {
      printf("\n%s\n%s",
             "1:***** 2:****** 3:QuickPass",
             "Choose(0 to exit):");
      scanf("%d", &choose);
   
      switch (choose)
        {
        case 1:
          break;
        case 2:
          break;
        case 3:
          low = 1;
          high = R.last;
          QuickSort (&R, low, high);
          printf("\nAfte,");
          PrintSqtable (&R);
          break;
        case 4:
          break;
        case 0:
          exit (0);
        default:
          printf("\nErr Choose!\n");
        }
    }
  return 0;
}
[/code:1]
发表于 2004-11-28 17:37:02 | 显示全部楼层
你传递的参数是一个 指针的地址,但你要求的参数是一个Sqtable类型的指针,所以不兼容了。
回复

使用道具 举报

 楼主| 发表于 2004-11-28 20:14:42 | 显示全部楼层
那应该怎么改呢.
回复

使用道具 举报

发表于 2004-11-28 20:25:17 | 显示全部楼层
不太明白你排序原理,本来想叫你直接去掉&,但又不知你是不是交换地址排序(看代码是头痛的事 )不如你讲讲你的思路吧。
回复

使用道具 举报

 楼主| 发表于 2004-11-28 20:32:54 | 显示全部楼层
[code:1]
int QuickSort (sqtable *R, int low, int high)
{
  int pivotloc;
  if (low < high)
    {
      pivotloc = QuickPass (&R, low, high);   
      QuickSort (&R, low, pivotloc - 1);
      QuickSort (&R, pivotloc + 1, high);
[/code:1]

主要是这段.不知怎么改才能调用正确.
回复

使用道具 举报

发表于 2004-11-28 22:26:13 | 显示全部楼层
[quote:51da35b23d="sagaeon"]不太明白你排序原理,本来想叫你直接去掉&,但又不知你是不是交换地址排序(看代码是头痛的事 )不如你讲讲你的思路吧。[/quote]
try
[code:1]      
      QuickSort (R, low, pivotloc - 1);
      QuickSort (R, pivotloc + 1, high);
[/code:1]

另外,建议你可以考虑把quick-sort交换值的部分写成一个单独的函数,
这样, 你的sqtable里更改了什么东西, 只用改这个函数即可, 甚至
你可以写成c++ 模板, 这样可以sort任何东西, 成为你自己的函数库的一部分了
回复

使用道具 举报

发表于 2004-12-1 17:34:54 | 显示全部楼层
去掉&。如果楼主是在看严老师的数据结构的话不要照上面的原代码写,他的代码是类C语言,要用在C语言上的话得修改一下。
回复

使用道具 举报

发表于 2004-12-2 19:09:33 | 显示全部楼层
经典的pascal快排代码

[code:1]
procedure qsort(l, r: longint);
var i, j, mid: longint;
begin
i := l; j := r; mid := a[(l+r) div 2];
repeat
  while a[i]<mid do i:=i+1;
  while a[j]>mid do j:=j-1;
  if i<=j then beign
    swap(a[i], a[j]);
    i := i+1; j := j-1;
  end;
until i>j;
  if i<r then qsort(i,r);
  if l<j then qsort(l,j);
end;
[/code:1]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 23:30 , Processed in 0.046894 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表