回 帖 发 新 帖 刷新版面

主题:“合并排序”问题

《算法导论》第2章合并算法,下面是我实现的合并算法C代码:
#include <stdio.h> 
#include <stdlib.h> 
void merge_sort(int A[],int p,int r); 
void merge(int A[],int p,int q,int r); 
int main() 

int n; 

printf("please input the number of array: "); 
while(scanf("%d",&n)==1) 

  int i,j;int *A; 
  A=(int *)malloc(n*sizeof(int)); 
  printf("please input the array: "); 
  for(i=0;i <n;i++) 
  scanf("%d",&A[i]); 
  merge_sort(A,0,n-1); 
  printf("After the sort,the array is: ");
  for(j=0;j <n;j++) 
  printf("%d",A[i]); 
  free(A); 
  printf("\n");
  printf("please input another number of array: \n "); 

  return 0; 

void merge_sort(int A[],int p,int r) 

int q; 
if(p <r)        //若子序列A中不止一个元素 

q=(int)((p+r-1)/2);    //计算中间下标,将子序列A分为左子序列和右子序列 
merge_sort(A,p,q);      //对左子序列进行合并排序 
merge_sort(A,q+1,r);    //对右子序列进行合并排序 
merge(A,p,q,r);        //对左子序类和右子序列进行合并 


void merge(int A[],int p,int q,int r) 

int i,j,t,m=10;int *temp; //真是不知道该给m赋什么值,给个足够用的10
temp=(int *)malloc(m*sizeof(int));    //用来暂存合并后的序列 -----30行

t=p;                      //序列temp的下标计数器,从p开始 
i=p;                      //左子序A[P..Q]的下标计数器,从p开始 
j=q+1;                    //右子序A[Q+1..R]的下表计数器,从q+1开始 
//合并序列 
while(t <=r) 
{if(i <=q&&(j>r||A[i] <=A[j])) 
temp[t++]=A[i++]; 
else 
temp[t++]=A[j++]; } 
//将temp中的序列赋值给A 
for(i=p;i <=r;i++) 
A[i]=temp[i]; 
free(temp); 

执行后,出来的结果不正确,请研究过合并算法的朋友帮我看下哪里有问题,多谢!

回复列表 (共2个回复)

沙发

#include <stdio.h> 
#include <stdlib.h> 

void merge_sort(int p,int r); 
void merge(int p,int q,int r); 
int A[] = {0,6,5,43,2,1234,22,3,2,95,1};

int main() 

    int i,j; 
    for(i = 1; i <= 10; i++)
        printf("%d\n",A[i]);

    merge_sort(1,10); 
    for(j = 1; j <= 10; j++)
        printf("%d\n",A[j]); 
    
    system("PAUSE");
    return 0; 


void merge_sort(int p,int r) 

    int q; 
    if(p <r){
        q = (p+r) / 2; 
        merge_sort(p,q);
        merge_sort(q+1,r); 
        merge( p, q, r);
    }



void merge(int p,int q,int r) 

    int n1 = q - p + 1;
    int n2 = r - q;
    int L[10];
    int R[10];
    int i,j,e;
    
    for (i = 1; i <= n1; i++){
        L[i] = A[p + i -1];
    }
    for (j = 1; j <= n2; j++){
        R[j] = A[q + j];
    }
    L[i] = 2100000000;
    R[j] = 2100000000;
    i = j = 1;
    
    for(e = p; e <= r; e++){

        if(L[i] <= R[j]){
            A[e] = L[i];
            i++;
        }
        else{
            A[e] = R[j];
            j++;
        }
    }



我帮你重新改写的....
为了省事...
你照着我的算法换入到你的程序里就可以了.我定义的是全局变量
你改成传入指针就行了

板凳

#include <stdio.h> 
#include <stdlib.h> 

void merge_sort(int* A,int p,int r); 
void merge(int* A,int p,int q,int r); 

int main() 

    int j; 
    int A[] = {0,6,5,4,3,2,1};
    merge_sort(A,1,6); 
    for(j = 1; j <= 6; j++)
        printf("%d\n",A[j]); 
    
    system("PAUSE");
    return 0; 


void merge_sort(int* A,int p,int r) 

    int q; 
    if(p <r){
        q = (p+r) / 2; 
        merge_sort(A,p,q);
        merge_sort(A,q+1,r); 
        merge(A, p, q, r);
    }



void merge(int* A,int p,int q,int r) 

    int n1 = q - p + 1;
    int n2 = r - q;
    int L[100];
    int R[100];
    int i,j,e;
    
    for (i = 1; i <= n1; i++){
        L[i] = A[p + i -1];
    }
    for (j = 1; j <= n2; j++){
        R[j] = A[q + j];
    }
    L[i] = 999; //哨兵 要比要排序的所有元素都要大 
    R[j] = 999;
    i = j = 1;
    
    for(e = p ; e <= r; e++){

        if(L[i] <= R[j]){
            A[e] = L[i];
            i++;
        }
        else{
            A[e] = R[j];
            j++;
        }
    }



改成传入数组指针

我来回复

您尚未登录,请登录后再回复。点此登录或注册