快速排序,找不到错误了,希望大神们给找一下

The_Murderer 2014-03-16 08:29:16
#include<stdio.h>
//快速排序思路:
//1 将首元素作为基准元素,首元素位置留空
//2 从右边找比基准元素小的数,放到左边,右边一个空位
//3 从左边找比基准元素大的数,放到右边
//4 重复执行 2、3步,直到左边索引>=右边索引
//5 将基准元素放在当前左索引位置(差不多中间的位置)
#define LEN 8
int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 };

int Partition(int a[],int p,int r);
void Swap(int a,int b);

void QuickSort(int a[],int p,int r)
{
if(p<r)
{
int q=Partition(a,p,r);//q是当前划分点
printf("当前Q的值是:%d\n",a[q]);
for(int i=0;i<LEN;i++)
{
printf("%d,",a[i]);
}
printf("\n");
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
int Partition(int a[],int p,int r)
{
printf("当前P的值是:%d\n",a[p]);
int i=p,j=r+1;//i指向了数组的第一个数,j指向了数组的最后一个数
int x=a[p];//x现在的值是数组a的第一个值,x是基准元素

while(true)
{
while(a[++i]<x&&i<r);//一直往下找,找到比x小的数,继续程序,要注意i不能越界
while(a[--j]>x);//继续往前找,找到比x大的数,继续程序
if(i>=j)break;//
Swap(a[i],a[j]);//
}
a[p]=a[j];
a[j]=x;
return j;
}
void Swap(int a,int b)
{
int temp=0;
temp=a;
a=b;
b=temp;
}
int main()
{
printf("待排数组为:\n");
for(int i=0;i<LEN;i++)
{
printf("%d,",a[i]);
}
printf("\n");
QuickSort(a,0,LEN);
}
...全文
131 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
The_Murderer 2014-03-17
  • 打赏
  • 举报
回复
引用 6 楼 wang0635 的回复:

int main()
{
     printf("待排数组为:\n");
     for(int i=0;i<LEN;i++)
     {
          printf("%d,",a[i]);
     }
     printf("\n"); 
     QuickSort(a,0,LEN); //应该是 LEN - 1 吧
}
我晕。。。谢谢!!!
wang0635 2014-03-16
  • 打赏
  • 举报
回复

int main()
{
     printf("待排数组为:\n");
     for(int i=0;i<LEN;i++)
     {
          printf("%d,",a[i]);
     }
     printf("\n"); 
     QuickSort(a,0,LEN); //应该是 LEN - 1 吧
}
Guy_Fwakes 2014-03-16
  • 打赏
  • 举报
回复
楼上说的对,你的交换函数就错了,应该应用指针传递而不是值传递,这样交换的只是拷贝的值,可以这样修改: void Swap(int *a,int *b) { int temp=0; temp=*a; *a=*b; *b=temp; } 或者直接使用algorithme库中的swap()函数 另外几点小错误,35行while(true)中true ,c是不支持bool类型的,可以换成1,但我认为你应该修改你的逻辑 以及for(int i = 0;;)你在for语句中定义变量是不被vc6.0支持的,gcc添加 -std=c99 关于你的快排函数有点逻辑混乱,建议你单步调试,看看课本上的代码吧。
The_Murderer 2014-03-16
  • 打赏
  • 举报
回复
引用 3 楼 wang0635 的回复:
C语言函数参数是值参数。仔细看看课本,这一段都讲得很详细,一般也拿swap函数做例子
确实swap函数有问题,但是结果现在成了 待排数组为: 5,2,4,7,1,3,2,6, 当前P的值是:5 当前Q的值是:5 2,2,4,0,1,3,5,6, 当前P的值是:2 当前Q的值是:2 0,1,2,4,2,3,5,6, 当前P的值是:0 当前Q的值是:0 0,1,2,4,2,3,5,6, 当前P的值是:4 当前Q的值是:4 0,1,2,3,2,4,5,6, 当前P的值是:3 当前Q的值是:3 0,1,2,2,3,4,5,6, 当前P的值是:6 当前Q的值是:6 0,1,2,2,3,4,5,6, 请按任意键继续. . . 我的7去哪了
wang0635 2014-03-16
  • 打赏
  • 举报
回复
C语言函数参数是值参数。仔细看看课本,这一段都讲得很详细,一般也拿swap函数做例子
The_Murderer 2014-03-16
  • 打赏
  • 举报
回复
引用 1 楼 wang0635 的回复:
至少Swap函数不对,没有真正对换。用指针做参数
Swap函数应该对吧,为什么不对呢?
wang0635 2014-03-16
  • 打赏
  • 举报
回复
至少Swap函数不对,没有真正对换。用指针做参数

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧