回 帖 发 新 帖 刷新版面

主题:看看我的非递归快速排序有什么问题

程序运行后不会出现结果,希望高手们指教!源程序如下:
#include <stdio.h>
#define N 40
void quicksort(int a[],int t1,int t2)
{
int stack[N][2],i,top=0;
stack[top][0]=t1;
stack[top][1]=t2;
while(top>-1)
{
  t1=stack[top][0];
  t2=stack[top][1];
  top--;
  partition(a,t1,t2,i);
  if(t1<i-1)
  {
   top++;
   stack[top][0]=t1;
   stack[top][1]=i-1;
   }
  if(i+1<t2)
  {
   top++;
   stack[top][0]=i+1;
   stack[top][1]=t2;
   }
  }
  return;
}
  partition(int a[],int l,int h,int i)
{
      int j=h;   int x;
   i=l;


  x=a[i];
  do
  {
   while(x<=a[j]&&j>i)
   j--;
   if(j>i)
   {
    a[i]=a[j];
    i++;
    }
    while(x>=a[i]&&i<j)
      i++;
    if(i<j)
    {
     a[j]=a[i];
     j--;
     }
     }while(i!=j);
     a[i]=x;
    }

main()
{
  int i,a[N],n;
  printf("please input the number:");
  for(i=0;i<n;i++)
   scanf("%d",&a[i]);
  quicksort(a,1,n);
  printf("\nthe sorted array:");
  for(i=0;i<n;i++)
  printf("%d",a[i]);
  getch();
  }




回复列表 (共5个回复)

沙发

发一个我做的,希望给你点启发!

#include <stdio.h>
#include <conio.h>
#include <math.h>
#define MAX 100

typedef struct
{
    int ll;
    int lr;
}STR;

typedef struct       /*结构体定义*/
{
    STR help[MAX];
    int top;
}SQSTACK;


void initstack(SQSTACK *s) /*栈的初始化*/
{
    (*s).top = -1;
}

int stackempty(SQSTACK s) /*判断栈是否为空*/
{
    if (s.top == -1)
        return 1;
    else
        return 0;
}

void push(SQSTACK *s, int ll, int lr)  /*入栈*/
{
    if ((*s).top == MAX - 1) {printf("stack is full!");return;}
    (*s).top++;
    (*s).help[(*s).top].ll = ll;
    (*s).help[(*s).top].lr = lr;

}

void pop(SQSTACK*s, int *ll,int *lr)   /*出栈*/
{
    if ((*s).top == -1) {printf("stack is empty!");return;}
    *ll = (*s).help[(*s).top].ll;
    *lr = (*s).help[(*s).top].lr;
    (*s).top--;
}

void part(int r[], int ll, int lr, int *pivotloc) /*划分子表*/
{
    int temp,i,j;
    i = ll;
    j = lr;
    temp = r[ll];
    while (i != j)
    {
        while (j>i && r[j]>=temp)
            j--;
        if (i < j)
        {
            r[i] = r[j];
            i++;
        }
        while (j>i && r[i]<temp)
            i++;
        if (i < j)
        {
            r[j] = r[i];
            j--;
        }
    }
    r[i] = temp;
    *pivotloc = i;
}


void QuickSort(int a[], int n)  /*快排序*/
{
    int ll = 0;
    int lr = n - 1;
    int first = 0;

    SQSTACK use;
    initstack(&use);
    push(&use, ll, lr);

    while (!stackempty(use))
    {
        pop(&use, &ll, &lr);
        part(a, ll, lr, &first);

        if (ll!=(first-1) && first!=ll)
        {
            push(&use, ll, first - 1);
        }
        if (lr!=(first+1) && first!=lr)
        {
            push(&use, first + 1, lr);
        }
    }    
}


void InputArray(int a[], int *n)   /*输入数组*/
{
    int i;
    printf("Please input the numbers of the array:");
    scanf("%d",n);
    for (i=0; i<(*n); i++)
    {
        scanf("%d",&a[i]);
    }
}

void OutputArray(int a[],int n)   /*输出数组*/
{
    int i;
    for(i=0; i<n; i++)
    {
        printf("%4d",a[i]);
    }
}



void main()
{
    int n;
    int a[MAX];
    InputArray(a, &n);
    QuickSort(a, n);
    OutputArray(a, n);
    getch();
}

板凳

两位大哥,上面的程序是不是太麻烦了,一楼的老大,你的第一个主调函数的N传递的是多少啊?好象没有确定值啊

3 楼

回2楼的:

n 的值在InputArray()内输入!

4 楼


5 楼



帮你修改好了,你看看我注解的地方就知道什么地方错了,
你的整体上思想是对的,但是在细小的地方没有注意到,
比如数组界限啊,指针的传递啊...


#include <stdio.h>
#define N 40

  void partition(int a[],int l,int h,int *k)
{
   int j=h;   int x;
   int i=l;
  x=a[i];
  do
  {
   while(x<=a[j]&&j>i)
   j--;
   if(j>i)
   {
    a[i]=a[j];
    i++;
    }
    while(x>=a[i]&&i<j)
      i++;
    if(i<j)
    {
     a[j]=a[i];
     j--;
     }
     }while(i!=j);
     a[i]=x;
     *k=i;  //保存修改值
    }
    
void quicksort(int a[],int t1,int t2)
{
int stack[N][2],i=0,top=0;
stack[top][0]=t1;
stack[top][1]=t2;
while(top>-1)
{
  t1=stack[top][0];
  t2=stack[top][1];
  top--;
  partition(a,t1,t2,&i);   //i要用指针传递才可以被修改保存的
 if(t1<i-1)
  {
   top++;
   stack[top][0]=t1;
   stack[top][1]=i-1;
   }
  if(i+1<t2)
  {
   top++;
   stack[top][0]=i+1;
   stack[top][1]=t2;
   }
  }
}


void main()
{
  int i,a[N],n;
  printf("please input the number:");
  scanf("%d",&n);
  for(i=1;i<=n;i++)    //i要从1开始
   scanf("%d",&a[i]);
  quicksort(a,1,n);
  printf("\nthe sorted array:");
  for(i=1;i<=n;i++)    //i要从1开始
  printf("%d ",a[i]);
  printf("\n");
  }

我来回复

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