C 归并算法

概念:把数组分割成两个相同大小的子数组,对两个数组进行排序,然后再将他们合并成一个数组。对于有奇数个元素的数组,这个算法创建两个子数组,其中一个要比另一个多一个元素。

#include "stdio.h"
#include "stdlib.h"
#include "time.h"

#define SIZE 10

void mergeSort(int arr[],int low,int high);
void merge(int arr[],int low,int high,int low2,int high2);

int main(void)
{
    int loop,temp;
    int arr[SIZE];
    srand(time(NULL));
    
    printf("The Arrary before merge sort:\n");
    for(loop = 0; loop < SIZE; loop++){
        temp = rand()%99 + 1;
        printf("%d ",temp);
        arr[loop]  = temp;
    }

    mergeSort(arr,0,SIZE-1);

    printf("\nThe array after merge sort:\n");

    for(loop=0;loop < SIZE; loop++){
        printf("%3d",arr[loop]);
    }

    getchar();

    return 0;
}

void mergeSort(int arr[],int low,int high)
{
    int middle;
    if((high -low) >= 1){//当数组中的元素大于等于两个时分割子数组,然后归并
        middle = (low + high) /2;
        mergeSort(arr,low,middle);
        mergeSort(arr,middle+1,high);
        merge(arr,low,middle,middle+1,high);
    }
}

void merge(int arr[],int low,int high,int low2,int high2)
{
    int i=low,j=low2,k=low,loop;
    int temp[SIZE];
    while(i <= high && j<=high2){//相互比较,把小的元素放入临时数组temp中
        if(arr[i] <= arr[j]){
            temp[k++] = arr[i++];
        }else{
            temp[k++] = arr[j++];
        }
    }
    if(i == low2){//右数组还有元素
        while(j <= high2){
            temp[k++] = arr[j++];
        }
    }else{//做数组还有元素
        while(i <= high){
            temp[k++] = arr[i++];
        }
    }
    for(loop=low;loop <= high2; loop++){//把临时数组的元素复制到arr中
        arr[loop] = temp[loop];
    }
    
}

 

posted @ 2014-03-15 09:29  ShowJoy  阅读(302)  评论(0编辑  收藏  举报