首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • (求 大哥大姐们帮助)利用分治策略,在n个不同元素中找出第k个最小元素 【 最好有算法】 [已结贴,结贴人:kwxiang]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kwxiang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-03 14:20:30 楼主
    把n个元素放在顺序表中,然后取第k个元素作为标准m,把n个元素重新排列,分成两个区间:小于标准m的元素区间1~j,大于标准m的元素区间j+1~n,接下来有三种情况:
    1)j=k,则找到第k个元素。
    2)j <k,则第k个元素在区间j+1~n。
    3)j>k,则第k个元素在区间1~j。
    在情况2和3中继续寻找。
    150  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • baihacker
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-05-03 15:15:411楼 得分:30
    C/C++ code
    #include <stdio.h> #include <stdlib.h> int FindMinK(int data[], int l, int r, int k) { int m = data[l+k-1], t = 0; int i, j; data[l+k-1] = data[r], data[r] = m; for (i = l-1, j = l; j != r; ++j) if (data[j]<m) t=data[++i], data[i]=data[j], data[j]=t; t=data[++i], data[i]=data[j], data[j]=t; if (k==i-l+1) return m; if (k>i-l+1) return FindMinK(data, i+1, r, k-i+l-1); else return FindMinK(data, l, i-1, k); } int main() { int data[]={8,6,6,4,4,3,2,1}; for (int i = 1; i <= sizeof(data)/sizeof(data[0]); ++i) printf("%d\n", FindMinK(data, 0, 7, i)); return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • laolaoliu2002
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-03 15:21:502楼 得分:0
    c语言库函数中已经有bsearch()
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • WingForce
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-03 15:45:083楼 得分:0
    引用 2 楼 laolaoliu2002 的回复:
    c语言库函数中已经有bsearch()

    貌似lz要的不是2分查找。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hnjd314053754
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-03 16:28:594楼 得分:0
    学习学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ll268862
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-03 17:41:335楼 得分:0
    学习学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kwxiang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-04 14:57:306楼 得分:0
    所谓快速选择。。。
    1、从n个元素中任意选择一个元素a
    2、遍历n个元素,将它们分为大于k和小于k的2部分
    3、如果小于a的元素数量为k-1个,则a就是解
    4、如果小于a的元素数量大于等于k,则递归的对小于a的元素执行快速选择
    5、如果小于a的元素数量小于k-1,设大于a的元素有nr个,则递归的对这nr个元素执行快速选择,但是修改求解的目标为k - (n - nr)

    注:第1步选择元素a的算法一般为取n个元素的第一个,中间的和尾部的3元素中间的那个。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • WingForce
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-04 15:33:247楼 得分:25
    STL的nth_element的实现:

    C/C++ code
    template<typename _RandomAccessIterator> void nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last) { typedef typename iterator_traits<_RandomAccessIterator>::value_type _ValueType; while (__last - __first > 3) { _RandomAccessIterator __cut = std::__unguarded_partition(__first, __last, _ValueType(std::__median(*__first, *(__first + (__last - __first) / 2), *(__last - 1)))); if (__cut <= __nth) __first = __cut; else __last = __cut; } std::__insertion_sort(__first, __last); } template<typename _RandomAccessIterator> void __insertion_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) { if (__first == __last) return; for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) { typename iterator_traits<_RandomAccessIterator>::value_type __val = *__i; if (__val < *__first) { std::copy_backward(__first, __i, __i + 1); *__first = __val; } else std::__unguarded_linear_insert(__i, __val); } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fengalon_software
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-04 15:37:118楼 得分:20
    引用楼主 kwxiang 的帖子:
    把n个元素放在顺序表中,然后取第k个元素作为标准m,把n个元素重新排列,分成两个区间:小于标准m的元素区间1~j,大于标准m的元素区间j+1~n,接下来有三种情况:
    1)j=k,则找到第k个元素。
    2)j <k,则第k个元素在区间j+1~n。
    3)j>k,则第k个元素在区间1~j。
    在情况2和3中继续寻找。

    在顺序表中,这个方法的确是最好的。
    我说说大概,你可以做做
    声明3个变量
    int max = 99;
    int min = 0;
    int mid;

    定义个数组a[100]
    mid = (max+min)/2;

    定义个整型变量,你所需要找的数字
    int source;

    循环找到:
    while()
    {
      if(source == a[mid])
        {
          printf(mid);
          break;
        }
      else if(source < a[mid])
        {
          max = mid;
          mid = (max+min)/2;
        }
      else
        {
          min = mid;
          mid = (max+min)/2;
        }
    }
    思想就如上面。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kwxiang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-05 19:49:489楼 得分:0
    1楼同学的代码中 i <= sizeof(data)/sizeof(data[0])  能不能把改成i <=8呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kwxiang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-05 19:52:1910楼 得分:0
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXSIZE 100

    typedef int datatype;
    typedef struct
    {
        datatype data[MAXSIZE];
        int last;
    }SeqList;

    SeqList *CreatSeqList()
    {
        SeqList *L;
        int temp,i=0;
        L=(SeqList *)malloc(sizeof(SeqList));
        L->last=-1;
        printf("please input the numbers:(End with any character)\n");
        while(scanf("%d",&temp))
            L->data[i++]=temp;
        --i;
        L->last=i;
        return L;
    }

    datatype part(SeqList *L,int a,int b,int k)
    {
        int i,j,count;
        datatype m,n,x;
        m=L->data[k-1];
        for(i=a;i <=b;i++)
            if(L->data[i] <m)
        {
                n=L->data[i];
                for(j=i-1;j>=a;j--)
                    L->data[j+1]=L->data[j];
                L->data[0]=n;
        }
            count=0;
            if(m!=L->data[
            if(count==k-1)
        {
                x=L->data[k-1];
                return x;
        }
            if(count <k-1)
                part(L,count+1,b,k);
            else
                part(L,a,count,k);
    }


    main()
    {
        SeqList *L;
        datatype x;
        int k,n;
        L=CreatSeqList();
        n=L->last;
        printf("The total number is %d\n",n+1);
        printf("Now you can enter number k(1 <=k <=%d):\n",n+1);
        scanf("%d",&k);
        x=part(L,0,L->last,k);
        printf("The %d smallest is %d",k,x);
        getch();
    }


    这是我写的程序 不知道哪错了  能不能帮我改改 啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • baihacker
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-05-05 20:09:4111楼 得分:55
    C/C++ code
    #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int datatype; typedef struct { datatype data[MAXSIZE]; int last; }SeqList; SeqList *CreatSeqList() { SeqList *L; int temp,i=0; L=(SeqList *)malloc(sizeof(SeqList)); L->last=-1; printf("please input the numbers:(End with any character)\n"); while(scanf("%d",&temp)) L->data[i++]=temp; --i; L->last=i; return L; } datatype part(SeqList *L,int a,int b,int k) { int i,j; datatype m,t; datatype* data = L->data; m=data[a+k-1], data[a+k-1] = data[b],data[b] = m; for (i=a-1, j = a; j != b; ++j) if (data[j] < m) t=data[++i], data[i]=data[j], data[j]=t; t=data[++i], data[i]=data[j], data[j]=t; if (k==i-a+1) return m; if (k>i-a+1) return part(L, i+1, b, k-i+a-1); else return part(L, a, i-1, k); } int main() { SeqList *L; datatype x; int k,n; L=CreatSeqList(); n=L->last; printf("The total number is %d\n",n+1); printf("Now you can enter number k(1 <=k <=%d):\n",n+1); fflush(stdin); scanf("%d",&k); x=part(L,0,L->last,k); printf("The %d smallest is %d",k,x); // getch(); return 0; } please input the numbers:(End with any character) 1 3 4 5 7 9 b The total number is 6 Now you can enter number k(1 <=k <=6): 3 The 3 smallest is 4Press any key to continue
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wlly110
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-05 23:13:0512楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • glchen57
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-05 23:31:4313楼 得分:0
    这个问题的解法就是上面有人提到的分区那个算法,也就是快速排序算法的变种。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jillnicky
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-06 09:54:1314楼 得分:20
    引用 9 楼 kwxiang 的回复:
    1楼同学的代码中 i  <= sizeof(data)/sizeof(data[0])  能不能把改成i <=8呢?

    最好用sizeof()是根据系统来定数据大小的,这样,不管是移植到什么系统中,都可以保证其结果的正确性。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jillnicky
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-06 09:55:2215楼 得分:0
    貌似二分查找,好久没看数据结构中的算法了,呵呵!忘得差不多了。关注中……
    学习了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kings_zqz
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-06 10:25:5416楼 得分:0
    同学,呵呵
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved