快速排序

14号选手 2012-11-08 10:53:58
写了个快排的程序
但是vc调试总是出问题
控制台输出也不行,只能输入数字,不能排序
帮忙看下下面的代码,大家帮忙调试下
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
void Quick_sort(int *a,int left,int right);
int main(void)
{
int a[MAX],i;
for(i=0;i<MAX;i++)
scanf("%d",&a[i]);
Quick_sort(a,0,MAX-1);
printf("快速排序之后如下所示:\n");
for(i=0;i<MAX;i++)
printf("%d ",a[i]);
printf("\n");
system("pause");
return 0;
}
void Quick_sort(int *a,int left,int right)
{
int i,j,val;
val=a[left];
i=left;
j=right;
//分治法使得中间值左右两边分别所有小于和所有大于中间值
while(i!=j)
{
while(i<j&&a[j]>=val)
j--;
a[i++]=a[j];
while(i<j&&a[i]<=val)
i++;
a[j--]=a[i];
}
//i==j时,将中间量重新放置在a+i的位置
a[i]=val;
//递归左边
Quick_sort(a,left,i-1);
//递归右边
Quick_sort(a,i+1,right);
}
...全文
285 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzb56 2012-11-10
  • 打赏
  • 举报
回复
#include <stdio.h>
#define MAX 5

void Quick_sort(int *a,int left,int right);
int partition(int a[], int left, int right);
void qsort(int a[], int left, int right);

int main(void)
{
        int a[MAX];
        int i;
    int len = MAX;
        for(i = 0; i < len; ++i) {
                scanf("%d", &a[i]);
        }

        printf("快速排序之前如下所示:\n");
        for(i = 0; i < len; ++i) {
                printf("%d ", a[i]);
        }
        printf("\n");

        //Quick_sort(a, 0, len-1);
        qsort(a, 0, len -1);

        printf("快速排序之后如下所示:\n");
        for(i = 0; i < len; ++i) {
                printf("%d ", a[i]);
        }
        printf("\n");

        return 0;
}
void Quick_sort(int *a, int left, int right)
{
        int i,j,val;

        if(left < right) {
                val = a[left];
                i = left;
                j = right;

                //分治法使得中间值左右两边分别所有小于和所有大于中间值
                while(i < j) {
                        while(i < j && a[j] >= val) --j;
                        if(i < j) a[i++] = a[j];

                        while(i < j && a[i] < val) ++i;
                        if(i < j) a[j--] = a[i];
                }
                //i==j时,将中间量重新放置在a+i的位置
                a[i]=val;

                //递归左边
                Quick_sort(a, left, i - 1);
                //递归右边
                Quick_sort(a, i + 1, right);
        }
}

int partition(int a[], int left, int right) {
        int i;
        int j;
        int val;

        i = left;
        j = right;
        val = a[left];
        while(i < j) {
                while(i < j && a[j] >= val) --j;
                if(i < j) a[i++] = a[j];

                while(i < j && a[i] < val) ++i;
                if(i < j) a[j--] = a[i];
        }
        a[i] = val;

        return i;
}

void qsort(int a[], int left, int right) {
        if(left < right) {
                int pivot = partition(a, left, right);

                qsort(a, left, pivot - 1);
                qsort(a, pivot + 1, right);
        }

}
更多实现参见: http://blog.csdn.net/wzb56/article/details/7349083
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 17 楼 lansong4 的回复:
引用 16 楼 xuchao1229 的回复:引用 14 楼 lansong4 的回复:引用 12 楼 xuchao1229 的回复:引用 11 楼 lansong4 的回复:C/C++ code12345678910111213while(i<j)//判断改成这样,不然的话可能会死循环哦,如果数据是1,2....10的话,用你的会变成i>j哦,不会有i == j的情况 ……
恩,总是出现access volation什么的
Kuovane 2012-11-09
  • 打赏
  • 举报
回复
引用 16 楼 xuchao1229 的回复:
引用 14 楼 lansong4 的回复:引用 12 楼 xuchao1229 的回复:引用 11 楼 lansong4 的回复:C/C++ code12345678910111213while(i<j)//判断改成这样,不然的话可能会死循环哦,如果数据是1,2....10的话,用你的会变成i>j哦,不会有i == j的情况 { while(i<j&a……
用你写的代码运行一下,在那地方打个断点,看里面的数据,一切也就清楚了
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 14 楼 lansong4 的回复:
引用 12 楼 xuchao1229 的回复:引用 11 楼 lansong4 的回复:C/C++ code12345678910111213while(i<j)//判断改成这样,不然的话可能会死循环哦,如果数据是1,2....10的话,用你的会变成i>j哦,不会有i == j的情况 { while(i<j&amp;amp;&amp;a……
恩,明白 1,2,3,4,5,6,7,8,9,10 val设置成了1 从后面开始找没有符合的数字,j就到了1那里,i==j了也跳出循环了(这里还是不太了解) 但是这时if(i>=j)return;就起作用了,这个语句的意思我懂了
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
先 http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express 右边Visual C++ 2010 Express下面的Select language...下拉选‘简体中文’,再按Install Now按钮 再参考C:\Program Files\Mi……
无法访问
Kuovane 2012-11-09
  • 打赏
  • 举报
回复
引用 12 楼 xuchao1229 的回复:
引用 11 楼 lansong4 的回复:C/C++ code12345678910111213while(i<j)//判断改成这样,不然的话可能会死循环哦,如果数据是1,2....10的话,用你的会变成i>j哦,不会有i == j的情况 { while(i<j&amp;&amp;a[j]>=val) j--; ……
要考虑所有的情况,特别是特殊情况,也许这组数据是正确的,但是另一组数据缺错误的
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 1 楼 mcmcmc 的回复:
a[i++]=a[j];是换位? 数据被你擦掉了
没换位 找到符合条件的就放置到合适的区域 大于中间量的就放在后面,小于的就放在前面
赵4老师 2012-11-09
  • 打赏
  • 举报
回复
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express 右边Visual C++ 2010 Express下面的Select language...下拉选‘简体中文’,再按Install Now按钮 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\qsort.c
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 11 楼 lansong4 的回复:
C/C++ code12345678910111213while(i<j)//判断改成这样,不然的话可能会死循环哦,如果数据是1,2....10的话,用你的会变成i>j哦,不会有i == j的情况 { while(i<j&&a[j]>=val) j--; if(a[j]<val)//如果a[j]<val才把a……
你的意思我了解,但是你看,比如说是5,7,4,3,6,1 执行循环之后当尾指针j停留在3的时候(执行了内循环的第一个while循环),然后从前面开始找比5大的数字,这时4不符合,往后找,移到了3的位置,这时i就等于j,这样不就不满足外层的条件了吗? 不知我这样理解是否正确,呵呵,求指导
Kuovane 2012-11-09
  • 打赏
  • 举报
回复
while(i<j)//判断改成这样,不然的话可能会死循环哦,如果数据是1,2....10的话,用你的会变成i>j哦,不会有i == j的情况
    {
        while(i<j&&a[j]>=val)
            j--;
    if(a[j]<val)//如果a[j]<val才把a[j]放到前面去,不然就没必要了
           a[i++]=a[j];
          
        while(i<j&&a[i]<=val)
            i++;
        if(a[i] > val)//如果a[i]val时,才把a[i]放到后面去,不然也没必要了
            a[j--]=a[i];
          
    }
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 4 楼 zhuankeshumo 的回复:
C/C++ code12345678910111213141516171819202122232425262728void qsort_one_fun(int a[], int begin, int end){ if (begin<end) { int b=begin; int e=end; int t……
交换不了啊
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 8 楼 lansong4 的回复:
引用 6 楼 xuchao1229 的回复:引用 4 楼 zhuankeshumo 的回复:C/C++ code12345678910111213141516171819202122232425262728void qsort_one_fun(int a[], int begin, int end){ if (begin<end) { ……
呵呵,还是有点不明白,能否说的详细点 还有这个地方
while(i<j)//判断改成这样,不然的话可能会死循环哦
    {
        while(i<j&&a[j]>=val)
            j--;
    if(a[j]<val)//只有在这情况下才交换
           a[i++]=a[j];
         
        while(i<j&&a[i]<=val)
            i++;
        if(a[i] > val)//只有在这情况下才交换
            a[j--]=a[i];
         
    }
里面交换值得时候,不是 while(i<j&&a[j]>=val)已经执行完毕,找到需要的值,下面交换时if判断个人觉得多余啊,因为判断条件就是找出小于中间值的那个元素
Kuovane 2012-11-09
  • 打赏
  • 举报
回复
引用 6 楼 xuchao1229 的回复:
引用 4 楼 zhuankeshumo 的回复:C/C++ code12345678910111213141516171819202122232425262728void qsort_one_fun(int a[], int begin, int end){ if (begin<end) { int b=begin; ……
呵呵,后面的语句会执行。 下面这一句,当i>=10时,就越界了 //i==j时,将中间量重新放置在a+i的位置 a[i]=val;
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 3 楼 lansong4 的回复:
C/C++ code1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include <stdio.h>#include <stdlib.h>#define MAX 10void Quick_sort(int *a,int left,int right);int m……
还有一个问题 while里面的入口条件i!=j应该不会死循环吧,头尾指针移动到同一位置的时候不就退出外层的while循环了吗?
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 4 楼 zhuankeshumo 的回复:
C/C++ code12345678910111213141516171819202122232425262728void qsort_one_fun(int a[], int begin, int end){ if (begin<end) { int b=begin; int e=end; int t……
外层的if判断语句不需要吧 当头尾指针相等时就不会进入循环了,就会往下执行了的啊
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 3 楼 lansong4 的回复:
C/C++ code1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include <stdio.h>#include <stdlib.h>#define MAX 10void Quick_sort(int *a,int left,int right);int m……
恩,这样是可以了 但是我的程序编译能通过,为什么手动输入数据就不能打印出结果呢?
newtee 2012-11-09
  • 打赏
  • 举报
回复

void qsort_one_fun(int a[], int begin, int end)
{
    if (begin<end)
    {        
        int b=begin;
        int e=end;
        int temp=a[b];

        while(b<e)
        {
            while (b<e && a[e]>=temp)
            {
                e--;
            }
            a[b]=a[e];
            while (b<e && a[b]<=temp)
            {
                b++;
            }
            a[e]=a[b];
        }
        a[b]=temp;
        qsort_one_fun(a, begin, e-1);
        qsort_one_fun(a, e+1, end);
    }
    return;    
}
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 23 楼 SKATE11 的回复:
上面都说清楚了 结贴吧
结贴也没你啥事啊,呵呵
赵4老师 2012-11-09
  • 打赏
  • 举报
回复
引用 15 楼 xuchao1229 的回复:
引用 13 楼 zhao4zhong1 的回复: 先 http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express 右边Visual C++ 2010 Express下面的Select language...下拉选‘简体中文’,再按Install Now按钮 再参考C:\Prog……
刚上去看了一下,微软链接更新了,主推2012了。 http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装
SKATE11 2012-11-09
  • 打赏
  • 举报
回复
上面都说清楚了 结贴吧
加载更多回复(6)

69,335

社区成员

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

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