归并算法的实现

来源:互联网 发布:什么是淘宝直通车? 编辑:程序博客网 时间:2024/06/14 07:01


#include<stdio.h>#include <stdlib.h>void merge(int arr[],int low,int mid,int high){int i,k;int *tmp = (int *)malloc((high-low+1)*sizeof(int));int left_low=low,left_high=mid;int right_low=mid+1,right_high=high;//对左右两个数组进行比较for(k=0;left_low<=left_high && right_low<=right_high;k++){if(arr[left_low]<arr[right_low])tmp[k]=arr[left_low++];elsetmp[k]=arr[right_low++];}    if(left_low <= left_high){  //若第一个序列有剩余,直接复制出来粘到合并序列尾    //memcpy(tmp+k, arr+left_low, (left_high-left_low+l)*sizeof(int));    for(i=left_low;i<=left_high;i++)        tmp[k++] = arr[i];    }    if(right_low <= right_high){    //若第二个序列有剩余,直接复制出来粘到合并序列尾    //memcpy(tmp+k, arr+right_low, (right_high-right_low+1)*sizeof(int));        for(i=right_low; i<=right_high; i++)            tmp[k++] = arr[i];    }    for(i=0; i<high-low+1; i++)        arr[low+i] = tmp[i];return;}void merge_sort(int arr[], unsigned int first, unsigned int last){    int mid = 0;int i;    if(first<last){        mid = (first+last)/2;         merge_sort(arr, first, mid);        merge_sort(arr, mid+1,last);        merge(arr,first,mid,last);    }    return;}int main(){int i;int a[10]={9,8,7,6,5,4,3,2,1,0};for(i=0;i<10;i++)printf("%d ",a[i]);merge_sort(a,0,9);printf("\n");for(i=0;i<10;i++)printf("%d ",a[i]);return 0;}


难点:函数递归调用的理解较为复杂


原创粉丝点击