/*
* szlMergeSort.h
*/
#ifndef SZL_MERGESORT_H
#define SZL_MERGESORT_H
void mergeSort(int a[], int n);
#endif
/*
* szlSectionMergeSort.h
*/
#ifndef SZL_SECTIONMERGESORT_H
#define SZL_SECTIONMERGESORT_H
void sectionMergeSort(int a[], int left, int right);
#endif
/*
* szlSectionMergeSort.c
*/
#include "szlSectionMergeSort.h"
#include "stdlib.h"
/*
* 递归排序值归并排序:划分为两部分, 分别排序之后在归并。
*/
void sectionMergeSort(int a[], int left, int right){
int mid = (left + right)/2;
int i, j;
int *b;
if(left >= right){
return;
}
sectionMergeSort(a,left,mid);
sectionMergeSort(a,mid+1,right);
//
b = (int *)malloc(sizeof(int)*(right-left+1));
for(i=left,j=mid+1;i<=mid&&j<=right;){
if(a[i]<a[j]){
b[(i-left)+(j-mid-1)] = a[i];
i++;
}
else{
b[(i-left)+(j-mid-1)] = a[j];
j++;
}
}
if(i == mid+1){
for(;j<=right;j++){
b[(i-left)+(j-mid-1)] = a[j];
}
}
else{ // j == right + 1
for(;i<=mid;i++){
b[(i-left)+(j-mid-1)] = a[i];
}
}
for(i=0;i<right-left+1;i++){
a[left+i] = b[i];
}
if(b){
free(b);
}
}
/*
* szlMergeSort.c
*
*/
#include "szlMergeSort.h"
#include "szlSectionMergeSort.h"
void mergeSort(int a[], int n){
sectionMergeSort(a, 0, n-1);
}
更清晰的版本:
/*
* mergesort.c
*/
#define N 30
#include <stdio.h>
#include <stdlib.h>
void merge (int a[], int left, int right){
int i, j, k;
int mid = left + (right - left ) / 2;
int * b = (int * ) malloc (sizeof (int) * (right - left + 1));
i = left; j = mid + 1; k = 0;
while (i <= mid && j <= right){
if (a[i] < a[j]){
b[k] = a[i++];
}
else{
b[k] = a[j++];
}
k++;
}
if (i > mid ){
while (j <= right){
b[k++] = a[j++];
}
}
else{
while (i <= mid){
b[k++] = a[i++];
}
}
for (i = left; i <= right; i++){
a[i] = b[i-left];
}
free (b);
}
void mergesort (int a[], int left, int right){
if (left < right){
mergesort (a, left, left + (right - left) / 2);
mergesort (a, left + (right - left) / 2 + 1, right);
merge (a, left, right);
}
}
int main (int argc, char ** argv){
int n;
int i;
int a[N];
#ifdef DEBUG1
freopen ("in.txt", "r", stdin);
#endif
scanf ("%d", &n);
for (i=0; i<n; i++)
scanf ("%d", &a[i]);
mergesort (a, 0, n-1);
for (i=0; i<n; i++)
printf ("%d ", a[i]);
#ifdef DEBUG1
fclose (stdin);
#endif
return 0;
}