免费注册 查看新帖 |

Chinaunix

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

[算法] 用快速排序算法对文件中的记录进行排序的问题, 看看这段代码错在哪里了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-27 19:36 |只看该作者 |倒序浏览
/*已知文件中每条记录长度为50byte, 共20条记录*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OUT_FN "sorted"
void q_sort(FILE *outfp, int left, int right)
{
        unsigned char templ[50];
        unsigned char tempr[50];
        unsigned char tempp[50];
        unsigned char temp[50];
        int l_hold = left;
        int r_hold = right;
        int pivot;

        fseek(outfp,l_hold*(50l),0);
        fread(templ,50,1,outfp);

        fseek(outfp,r_hold*(50l),0);
        fread(tempr,50,1,outfp);
       
        strcpy(tempp,templ);

        while (left < right)
        {
                while ((strcmp(tempr,tempp) >= 0) && (left < right))
                {
                        right--;
                        fseek(outfp,right*(50l),0);
                        fread(tempr,50,1,outfp);
                }
                if (left != right)
                {
                        fseek(outfp,left*(50l),0);
                        fwrite(tempr,1,50,outfp);
                        left++;
                }
                while ((strcmp (templ,tempp) <= 0) && (left < right))
                {
                        left++;
                        fseek(outfp,left*(50l),0);
                        fread(templ,50,1,outfp);
                }
                if (left != right)
                {
                        fseek(outfp,right*(50l),0);
                        fwrite(templ, 1,50,outfp);
                        right--;                       
                }
        }
        fseek(outfp,left*(50l),0);
        fwrite(tempp,1,50,outfp);

        pivot = left;
        left = l_hold;
        right = r_hold;
        if (left < pivot)
                q_sort(outfp, left, pivot-1);
        if (right > pivot)
                q_sort(outfp, pivot+1, right);
}

int main(void)
{
        FILE * outfp = fopen(OUT_FN, "rb+");
        q_sort(outfp, 0, 19);

        fclose(outfp);


}

论坛徽章:
0
2 [报告]
发表于 2007-03-27 20:26 |只看该作者
求助中....

论坛徽章:
0
3 [报告]
发表于 2007-03-27 20:33 |只看该作者
快排一般都是内排序的。。
你的代码都是直接I/O交换记录,性能太差啊...

论坛徽章:
0
4 [报告]
发表于 2007-03-27 20:46 |只看该作者
原帖由 redhat008 于 2007-3-27 20:33 发表
快排一般都是内排序的。。
你的代码都是直接I/O交换记录,性能太差啊...

那如果把全部记录读到内存
要用到二维数组 record[20][50]
我一直没搞懂二维数组作为参数在函数中传递的实现
和 怎么用strcmp 比较 二维数组

论坛徽章:
0
5 [报告]
发表于 2007-03-27 21:00 |只看该作者
二维数组可以用 指针的指针 来 传递啊

论坛徽章:
0
6 [报告]
发表于 2007-03-28 11:17 |只看该作者
不考虑性能
直接i/o交换记录
这样真的行不通吗?
有没有高手帮我看看1楼的代码啊

论坛徽章:
0
7 [报告]
发表于 2007-03-28 11:43 |只看该作者
你把你程序中所有的fseek函数都去掉。


再man一下fread fwrite

论坛徽章:
0
8 [报告]
发表于 2007-03-28 12:56 |只看该作者
原帖由 MackedNice 于 2007-3-28 11:43 发表
你把你程序中所有的fseek函数都去掉。


再man一下fread fwrite



去掉 fseek怎么定位文件中的记录啊?

能详细点吗?

论坛徽章:
0
9 [报告]
发表于 2007-03-28 16:27 |只看该作者
学习,谁能给个快速排序的Demo
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP