读书人

小弟我编写的快速排序法显示的第一个

发布时间: 2012-02-05 12:07:14 作者: rapoo

我编写的快速排序法,显示的第一个数字总是不对,请教指点迷津。
下面是原代码:
**************************************************************************

/*qicksort()*/

#include <stdio.h>
int sort(int a[],int l,int h)
{
int i,j,pivot;
i=l;
j=h;
pivot=a[l];
while(i <j)
{
while(i <j&&a[j]> pivot)j--;
a[i]=a[j];
while(i <j&&a[i] <pivot)i++;
a[j]=a[i];
}
a[i]=pivot;
return i;
}
void qicksort(int a[],int l,int h)
{int k;
if(l <h)
{
k=sort(a,l,h);
qicksort(a,l,k-1);
qicksort(a,k+1,h);}
}
main()
{
int num[10],i;
for(i=0;i <10;i++)
scanf( "%d ",&num[i]);
for(i=0;i <10;i++)
printf( "%3d ",num[i]);
qicksort(num,0,10);
printf( "\nsort after:\n ");
for(i=0;i <10;i++)
printf( "%3d ",num[i]);
printf( "\n ");
getch();
}



[解决办法]
这个是我们数据结构课的源码,你看看先这个快排


#include <stdio.h>
#define MAXE 20/*线性表中最多元素个数*/
typedef int KeyType;
typedef char InfoType[10];
typedef struct /*记录类型*/
{
KeyType key; /*关键字项*/
InfoType data; /*其他数据项,类型为InfoType*/
} RecType;
void QuickSort(RecType R[],int s,int t) /*对R[s]至R[t]的元素进行快速排序*/
{
int i=s,j=t,k;
RecType temp;
if (s <t) /*区间内至少存在一个元素的情况*/
{
temp=R[s]; /*用区间的第1个记录作为基准*/
while (i!=j) /*从区间两端交替向中间扫描,直至i=j为止*/
{
while (j> i && R[j].key> temp.key)
j--; /*从右向左扫描,找第1个关键字小于temp.key的R[j] */
if (i <j) /*表示找到这样的R[j],R[i]、R[j]交换*/
{
R[i]=R[j];
i++;
}
while (i <j && R[i].key <temp.key)
i++;/*从左向右扫描,找第1个关键字大于temp.key的记录R[i] */
if (i <j) /*表示找到这样的R[i],R[i]、R[j]交换*/
{
R[j]=R[i];
j--; }
}
R[i]=temp;
printf( " ");/*输出每一趟的排序结果*/
for (k=0;k <10;k++)
if (k==i)
printf( " [%d] ",R[k].key);
else
printf( "%4d ",R[k].key);
printf( "\n ");
QuickSort(R,s,i-1); /*对左区间递归排序*/
QuickSort(R,i+1,t); /*对右区间递归排序*/
}
}
void main()
{
int i,k,n=10;
KeyType a[]={6,8,7,9,0,1,3,2,4,5};
RecType R[MAXE];
for (i=0;i <n;i++)
R[i].key=a[i];
printf( "\n ");
printf( " 初始关键字 ");/*输出初始关键字序列*/
for (k=0;k <n;k++)
printf( "%4d ",R[k].key);
printf( "\n ");
QuickSort(R,0,n-1);
printf( " 最后结果 ");/*输出初始关键字序列*/
for (k=0;k <n;k++)
printf( "%4d ",R[k].key);
printf( "\n\n ");
}

[解决办法]
看看我写的快速排序法吧,应该有点用
//快速排序法,全程演示。

#include <stdio.h>

void run(int *p, int left, int right, int num)
{
int middle,i,j,temp,k;
int exchange = 0;
i = left;
j = right;
middle = *(p+((i+j)/2));
printf( "the status of the son queue is : ");
for(k=i; k <=j; k++)
{
printf( "%6d ",*(p+k));
}
printf( "\n ");
printf( "the middle value is %d \n ", middle);
while (i <=j)


{
while(*(p+i) < middle && (i < right))
{ //寻找大于中间值的数
i++;
}
while(*(p+j) > middle && (j > left))
{
j--;
}
if(i <= j)
{
exchange++;
printf( "the %d exchange, %d and %d \n ", exchange, *(p+i), *(p+j));
temp = *(p+i);
*(p+i) = *(p+j);
*(p+j) = temp;
i++;
j--;
}
}
printf( "\n ");
printf( "the status of the queue is : ");
for(k=0; k <num; k++)
{
printf( "%6d ",*(p+k));
}
printf( "\n ");
if(i < right)
{
run(p, i, right, num);
}
if(j > left)
{
run(p, left, j, num);
}
}

int main(int argc, char *argv[])
{
int data[100],i,num;
printf( "please input the number of the integer :\n ");
scanf( "%d ", &num);
printf( "please input %d integer:\n ", num);
for(i=0; i <num; i++)
{
printf( "the %d number: ", i+1);
scanf( "%d ",&data[i]);
}
printf( "the number you have input is: ");
for(i=0; i <num; i++)
{
printf( "%6d ",data[i]);
}
printf( "\n ");
run(data, 0, num-1, num);
printf( "the final result is as follow : ");
for(i=0; i <num; i++)
{
printf( "%6d ",data[i]);
}
printf( "\n ");
}

读书人网 >C语言

热点推荐