用c语言实现归并排序

来源:互联网 发布:荣威车质量怎么样知乎 编辑:程序博客网 时间:2024/05/24 01:43

分治模式的三个步骤:分解,解决,合并。在解决步骤中,算法递归地调用自身,以解决问题

归并排序算法遵循分治模式。



//merge_sort(A,p,r):2.3.1 in <introduction to algorithms>
 
 #include<stdio.h>
 #include<stdlib.h>
 
 //merge 2 ordered lists into 1 list:a[low..mid] and a[mid+1..high]-->a[low..high] 
 //here is a sentinel in the end of each list, it can reduce checks and improve effectiveness
 //given that max number is less than 1000000
void merge(int * a,int low,int mid,int high)
 {
  int left,right,i,j,k;
  left=mid-low+1;
  right=high-mid;
  //下边两个数组,设置了哨兵,简化了比较过程 
  int * right_list=(int *)malloc((right+1)*sizeof(int));
  int * left_list=(int *)malloc((left+1)*sizeof(int));
  if(left_list==NULL || right_list==NULL)
  {
return ;
    }  
    for(i=0;i<left;i++)
    {
    left_list[i]=a[low+i];
    }
    for(j=1;j<=right;j++)
    {
    right_list[j-1]=a[mid+j];
    }
    //2个哨兵,假设情况是数组中的元素都小于1000000,在算法导论中为无穷大 
//大家需根据实际情况设置 
    left_list[left]=1000000;
    right_list[right]=1000000;
    i=0;
    j=0;
    for(k=low;k<=high;k++)
    {
    //下边的一行代码与注释代码意义相同,都是进行二路归并的 
    a[k]=((left_list[i]<right_list[j])?(left_list[i++]):(right_list[j++]));
/*
    if(left_list[i]<right_list[j])
    {
    a[k]=left_list[i];
    i++;
   }
   else
   {
    a[k]=right_list[j];
    j++;
    }
*/
    }
 }
 //二路归并排序  a[low..high],其中,特殊情况a【0,length-1】为对整个数组排序 
void merge_sort(int *a, int low,int high)
 {
  int mid;
  if (low<high)
  {
  mid=(low+high)/2;
merge_sort(a,low,mid);    //前半部分归并 
merge_sort(a,mid+1,high); // 后半部分归并 
merge(a,low,mid,high);//进行归并
}
 }
 
 int main()
 {
  int a[14]={3,8,22,4,2,9,14,12,0,1,11,15,13,18};
  int i;
    printf("Before merge sort: ");  
    printf("\n");
    for(int i=0;i<14;i++)  
    {  
        printf("%d\t",a[i]); 
    } 
    printf("\n");
  merge_sort(a,0,13);
  printf("After merge sort: ");  
    printf("\n");
  for(i=0;i<14;i++)
  {
printf("%d\t",a[i]);
}
    printf("\n");
return 0;
 }

最终结果:


原创粉丝点击