归并排序 c语言实现

本文介绍了一种使用C语言实现的归并排序算法。通过递归将数组分成更小的部分进行排序,然后合并这些部分来得到最终排序好的数组。文章包含了完整的代码示例,展示了如何初始化数组、执行排序操作以及打印排序前后的数组。
摘要由CSDN通过智能技术生成

好吧,跟  http://blog.csdn.net/morewindows/article/details/6678165  差不多是一样的。。


#define ARR_SIZE 30



#include <limits.h>
#include <stdlib.h>

#include <assert.h>


void mergeSort(int *arr, int first, int last, int *temp);
void merge(int *arr, int first, int mid, int last, int *temp);
void print(int *arr);

void mergeSort(int *arr, int first, int last, int *temp){
    int mid = 0;
    if(first >= last){
        return;
    } else {
        mid = (first + last) / 2;
        mergeSort(arr, first, mid, temp);
        mergeSort(arr, mid + 1, last, temp);
        merge(arr, first, mid, last, temp);
    }
}


void merge(int *arr, int first, int mid, int last, int *temp){
   int pos = first;
   int pos1 = first;
   int pos2 = mid + 1;
   while(pos1 <= mid && pos2 <= last){
        if(temp[pos1] <= temp[pos2]){
            arr[pos++] = temp[pos1++];
        } else {
            arr[pos++] = temp[pos2++];
        }
   }
   if(pos1 > mid){       //pos2 does not exceed last
        while(pos2 <= last){
            arr[pos++] = temp[pos2++];
        }
   } else {             //pos1 does not exceed mid
        while(pos1 <= mid){
            arr[pos++] = temp[pos1++];
        }
   }


    assert(pos == last + 1);
   //copy sorted arr to temp
   for(pos = first; pos <= last; ++pos){
        temp[pos] = arr[pos];
   }
}


int main(){
    int index;
    int arr[ARR_SIZE];
    int temp[ARR_SIZE];
    int num = 0;
    for(index = 0; index < ARR_SIZE; ++index){
        num = rand();
        arr[index] = temp[index] = 100 * ((float)num / RAND_MAX);
    }
    printf("elements before sort:\n");
    print(arr);
    mergeSort(arr, 0, ARR_SIZE - 1, temp);
    printf("elements after sort:\n");
    print(arr);
    return 0;
}


void print(int *arr){
    int index;
    for(index = 0; index < ARR_SIZE; ++index){
        printf("%d ", arr[index]);
    }
    printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值