主题:看看我的非递归快速排序有什么问题
edihall
[专家分:10] 发布于 2005-03-25 22:23:00
程序运行后不会出现结果,希望高手们指教!源程序如下:
#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个回复)
沙发
twopiece12 [专家分:2340] 发布于 2005-03-26 01:04:00
发一个我做的,希望给你点启发!
#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();
}
板凳
Lonerwang [专家分:100] 发布于 2005-03-28 10:00:00
两位大哥,上面的程序是不是太麻烦了,一楼的老大,你的第一个主调函数的N传递的是多少啊?好象没有确定值啊
3 楼
twopiece12 [专家分:2340] 发布于 2005-04-01 12:45:00
回2楼的:
n 的值在InputArray()内输入!
4 楼
喆喆 [专家分:90] 发布于 2006-04-09 09:06:00
5 楼
codedream [专家分:0] 发布于 2006-09-07 13:53:00
帮你修改好了,你看看我注解的地方就知道什么地方错了,
你的整体上思想是对的,但是在细小的地方没有注意到,
比如数组界限啊,指针的传递啊...
#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");
}
我来回复