免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2152 | 回复: 10
打印 上一主题 下一主题

[C] 请教-关于快排 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-08 15:55 |只看该作者 |倒序浏览
我自己复习基础算法的时候写了个快速排序的代码,但总是进入死循环,帮我看看怎么回事吧,谢谢!
我的代码:
void q_sort(int *arr, int low, int high){
        int i;
        while(low < high){
                i = partion(arr, low, high);
                q_sort(arr, low, i - 1);
                q_sort(arr, i + 1, high);
        }
}
int partion(int *arr, int low, int high){
        printf("low and high are %d, %d\n", low, high);
        int temp = arr[low];
        while(low < high){
                while(low < high && arr[high] >= temp)
                        high--;
                arr[low] = arr[high];
                while(low < high && arr[low] <= temp)
                        low++;
                arr[high] = arr[low];
        }
        arr[low] = temp;
        printf("mid is %d\n", low);
        return low;
}
以下是我用gdb查错的一个地方,很诡异(gdb用得少,不知道怎么会这样),明明low 和high 相等,但还是进入了while,我想程序的bug就在这里吧,但不知道如何修改程序。
(gdb) s
q_sort (arr=0xbf808be0, low=4, high=4) at sort.c:116
116          while(low < high){
(gdb) s
117                  i = partion(arr, low, high);
请牛人解说一下,谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-04-08 17:22 |只看该作者

回复 #1 chenchanjob 的帖子

是我的问题太弱智了吗 。。。

论坛徽章:
0
3 [报告]
发表于 2009-04-09 00:34 |只看该作者

回复 #2 chenchanjob 的帖子

你这代码写的真是有点郁闷人!上面第一个函数中的low 和 high 值一直没有变化!吼吼!

[ 本帖最后由 bladmin 于 2009-4-9 09:49 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-04-09 00:36 |只看该作者
原帖由 chenchanjob 于 2009-4-8 15:55 发表
我自己复习基础算法的时候写了个快速排序的代码,但总是进入死循环,帮我看看怎么回事吧,谢谢!
我的代码:
void q_sort(int *arr, int low, int high){
        int i;
        while(low < high){
     ...


我大概修改了下你的代码,这样应该可以了,你看看!
#include<stdio.h>
void q_sort(int *arr, int low, int high){
                int i;
                i = partion(arr, low, high);
                printf("%d\n",i);
                if(low <i-1){
                        q_sort(arr, low, i - 1);
                }
                if(high>i+1){
                        q_sort(arr, i + 1, high);
                }
}
int partion(int *arr, int low, int high){
        printf("low and high are %d, %d\n", low, high);
        int temp = arr[low];
        while(low < high){
                while(low < high && arr[high] >= temp){
                        high--;
                }
                arr[low] = arr[high];
                while(low < high && arr[low] <= temp){
                        low++;
                }
                arr[high] = arr[low];
        }
        arr[low] = temp;
        printf("mid is %d\n", low);
        return low;
}
int main(){
        int index =0;
        int arr[] = {49,38,65,97,76,13,27};
        q_sort(arr,0,6);
        for(index=0;index<7;i++){
                printf("%d",  arr[index]);   
                printf("\n");
        }
}

[ 本帖最后由 bladmin 于 2009-4-9 10:01 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-04-09 08:40 |只看该作者
template <class T>
inline void my_swap(T &x, T &y)
{
    T z;
    z = y;
    y = x;
    x = z;
}


或者:

#include <algorithm>

swap(x, y);


或者:

typedef int Element;
#define swap_(a, b) { Element tmp = b; b = a; a = tmp; }

论坛徽章:
0
6 [报告]
发表于 2009-04-09 09:20 |只看该作者

回复 #3 bladmin 的帖子

快排的时候确实是这样就行了,不用中间交换

论坛徽章:
0
7 [报告]
发表于 2009-04-09 09:26 |只看该作者
void q_sort(int *arr, int low, int high){
        int i;
        while(low < high){
                i = partion(arr, low, high);
                q_sort(arr, low, i - 1);
                q_sort(arr, i + 1, high);
        }
}

这里不应该是while(low < high) 应该是if

论坛徽章:
0
8 [报告]
发表于 2009-04-09 09:31 |只看该作者
(gdb) s
q_sort (arr=0xbf808be0, low=4, high=4) at sort.c:116
116          while(low < high){
(gdb) s
117                  i = partion(arr, low, high);


这是递归产生的,你试着在这里打印low和high就知道,是这;视觉误差

论坛徽章:
0
9 [报告]
发表于 2009-04-09 09:32 |只看该作者
把while换成if就ok了

  1. #include <stdio.h>

  2. int partion(int *arr, int low, int high){
  3.         printf("low and high are %d, %d\n", low, high);
  4.         int temp = arr[low];
  5.         while(low < high){
  6.                 while(low < high && arr[high] >= temp)
  7.                         high--;
  8.                 arr[low] = arr[high];
  9.                 while(low < high && arr[low] <= temp)
  10.                         low++;
  11.                 arr[high] = arr[low];
  12.         }
  13.         arr[low] = temp;
  14.         printf("mid is %d\n", low);
  15.         return low;
  16. }

  17. void q_sort(int *arr, int low, int high){
  18.         int i;
  19.         if(low < high){
  20.                 i = partion(arr, low, high);
  21.                 q_sort(arr, low, i - 1);
  22.                 q_sort(arr, i + 1, high);
  23.         }
  24. }


  25. int main()
  26. {
  27.         int array[] = {1,2,3,8,9,6,7};
  28.         q_sort(array, 0, sizeof(array) / sizeof(array[0]) - 1);
  29.         for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++)
  30.         {
  31.                 printf("%d ", array[i]);
  32.         }
  33.         return 0;
  34. }
复制代码

论坛徽章:
0
10 [报告]
发表于 2009-04-09 09:52 |只看该作者
原帖由 皇家救星 于 2009-4-9 09:20 发表
快排的时候确实是这样就行了,不用中间交换

呵呵,看错了,是不用!晚上有点困!

只是在一次交换后把temp放进去就好了!哈哈,不好意思!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP