#include <stdio.h>
#include <malloc.h>
void Merge_pass(int a[],int *tempA,int N,int length);
void Merge_sort(int a[],int N);
void Merge1(int a[],int *tempA,int L,int R,int RightEnd);
void Merge1(int a[],int *tempArray,int L,int R,int RightEnd){
int i,temp,LeftEnd,NumElemments;
LeftEnd = R - 1;
temp = L;
NumElemments = RightEnd - L + 1;
while(L <= LeftEnd && R <= RightEnd){
if(a[L] >= a[R]){
tempArray[temp] = a[R];
R++;
temp++;
}else{
tempArray[temp] = a[L];
L++;
temp++;
}
}
while(L <= LeftEnd){
tempArray[temp++] = a[L++];
}
while(R <= RightEnd){
tempArray[temp++] = a[R++];
}
}
void Merge_sort(int a[],int N){
int length = 1;
int *tempA;
tempA = malloc(N * sizeof(int));
if(tempA != NULL){
while(length < N){
Merge_pass(a,tempA,N,length);
length *= 2;
Merge_pass(tempA,a,N,length);
length *=2;
}
for(int i = 0;i < N;i++){
printf("%d ",a[i]);
}
free(tempA);
}else{
printf("空间不足");
}
}
void Merge_pass(int a[],int *tempA,int N,int length){
int i,j;
for(i = 0;i <= N-(2*length);i += 2*length){
Merge1(a,tempA,i,i+length,i+(2*length-1));
}
if(i + length < N){
Merge1(a,tempA,i,i+length,N-1);
}
else{
for(j = i;j < N;j++){
tempA[j] = a[j];
}
}
}
int main () {
int a[6] = {25,52,30,56,66,12};
printf("排序前的元素为:\n");
for(int i = 0;i < 6;i++){
printf("%d ",a[i]);
}
printf("\n");
printf("排序后的元素为:\n");
Merge_sort(a,6);
}