| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 668 人关注过本帖
标题:合并排序
只看楼主 加入收藏
Silence_
Rank: 2
等 级:论坛游民
帖 子:8
专家分:22
注 册:2012-9-18
收藏
得分:0 
回复 3楼 zhu224039
是这i++ j++的问题,去掉后就没问题了.
2012-10-17 01:02
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
你说的是那里

我要成为嘿嘿的黑客,替天行道
2012-10-17 02:33
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
算法介绍之分治算法
#include
void combin(int num[],int r,int p,int q)  /*合并过程*/
{   
    int lift[q-p],right[r-q+1],i,j,k;
    for(i=0;i<Q-P;I++){
        lift[i]=num[p+i];
    }
    for(i=0;i<R-Q+1;I++){
        right[i]=num[q+i];
    }
    i=0;j=0;
    for(k=p;k<=r;k++){
     if(i<Q-P&&J<R-Q+1){
        if(lift[i]>right[j]){
            num[k]=right[j];
            j++;
        }
        else{
            num[k]=lift[i];
            i++;
        }
      }
    else if(i==q-p){
          num[k]=right[j];
          j++;
      }
      else if(j==r-q+1){
          num[k]=lift[i];
          i++;
      }
      }
}
void combin_sort(int num[],int n,int p )   ;----------------递归分解合并过程
{   
       int q;
       q=(n+p)/2;
       if(p<N){
        combin_sort(num,q,p);                  
        combin_sort(num,n,q+1);
        combin(num,n,p,q+1);
    }
      
}
int main(int argc, char *argv[])               /*对一串无序的数据 进行排序 */
{
    int num[20],i=0,j;
    printf("please insert num insert q to quit\n");
    while(scanf("%d",num+i)==1){
        i++;
    }
    if(i>1){
      combin_sort(num,i-1,0);
    }
    for(j=0;j<I;J++)
    printf("%d ",num[j]);
    printf("done\n");
    return 0;
}

分治的中心思想为
满足条件 1个问题可以被分解成N个相同问题 。
求解过程 由N个问题经过组合而得到要求解的问题 。
分治包含操作过程
1.分解过程 2.合并过程
分解过程 是一个典型的递归思想
既然是递归 那么就应该有递归函数(函数完成动作部分),递归终止条件(原子操作),靠近递归终止条件的表达式

分治算法的递归函数式  x={a1,a2..........an} 代表问题集合  用F(1,N) (n>=1) 将其1分为二就得到集合 f(1,n/2)和f(n/2+1,n)
f(1,n)=f(1,n/2) combin f(n/2+1,n)   
然后对 f(1,n/2)和 f(n/2+1,n) 进行一分为二
归纳出
F(x,y)=f(x,y/2) combin f(y/2+1,y)   f(x,y/2)  表示的是集合{x.......y/2}  f(y/2+1,y) 表示的集合{y/2+1..............y}
当x,y的值  是有上一个(a,b)给出的 如果f(x,y)是左边部分 那么有表达式  x=a y=(a+b)/2 如果是右半部分就会是x=(a+b)/2+1,y=b
这么个关系存在 y的取值是上一个a,b的中间。
原子操作部分的确定
那么原子操作 怎么来确定对f(x,y)不能再分解条件 (x+y)/2=x和(x+y)/2=y 成立  注意这个/ 是取商运算,在整数运算,
如果余数是0 可以演化出x=y的  所以得到 原子操作的判断条件是 x=y
因为x<=y的,所以只要x<Y就要进行递归分解

递归靠近条件表达式就是  取中间量表达式  x+y/2

完成动作部分就是合并 过程  那么合并怎么来实现
合并规则
在上面排序程序 是将 两个排好序的 数组进行合并  F(a,(a+b)/2)和F((a+b)/2+1,b)两个数组集合元素 进行插入插入排序u 得到 F(a,b)

个人浅见 希望对大家有用

我要成为嘿嘿的黑客,替天行道
2012-10-17 02:35
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
#include <stdio.h>
void combin(int num[],int r,int p,int q)
{   
    int lift[q-p],right[r-q+1],i,j,k;
    for(i=0;i<q-p;i++){
        lift[i]=num[p+i];
    }
    for(i=0;i<r-q+1;i++){
        right[i]=num[q+i];
    }
    i=0;j=0;
    for(k=p;k<=r;k++){
     if(i<q-p&&j<r-q+1){
        if(lift[i]>right[j]){
            num[k]=right[j];
            j++;
        }
        else{
            num[k]=lift[i];
            i++;
        }
      }
    else if(i==q-p){
          num[k]=right[j];
          j++;
      }
      else if(j==r-q+1){
          num[k]=lift[i];
          i++;
      }
      }
}
void combin_sort(int num[],int n,int p )
{   
       int q;
       q=(n+p)/2;
       if(p<n){
        combin_sort(num,q,p);
        combin_sort(num,n,q+1);
        combin(num,n,p,q+1);
    }
      
}
int main(int argc, char *argv[])
{
    int num[20],i=0,j;
    printf("please insert num insert q to quit\n");
    while(scanf("%d",num+i)==1){
        i++;
    }
    if(i>1){
      combin_sort(num,i-1,0);
    }
    for(j=0;j<i;j++)
    printf("%d ",num[j]);
    printf("done\n");
    return 0;
}

这个是编译成功的 分治排序算法

我要成为嘿嘿的黑客,替天行道
2012-10-17 02:36
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
哦,程序运行正确么
我用递归做的,对于 不用递归的实现 没弄过


我要成为嘿嘿的黑客,替天行道
2012-10-17 02:38
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
奇偶情况下 都是正确的么 程序运行的结果

我要成为嘿嘿的黑客,替天行道
2012-10-17 02:54
快速回复:合并排序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024400 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved