先上代码
简单介绍下代码,这里的merge函数实现的是将已排好序的两小段数组合并且重新排序,mergesort为递归函数。
#include <stdio.h>
void merge(int arr[],int L,int M,int R){
int left_size=M-L;
int right_size=R-M+1;
int left[left_size];
int right[right_size];
int i,j,k ;
for (i=L;i<M;i++){
left[i-L]=arr[i];
}
for (i=M;i<=R;i++){
right[i-M]=arr[i];
}
i=0; j=0; k=L;
while(i<left_size && j < right_size){
if(left[i]<right[j]){
arr[k]=left[i];
i++;
k++;
}
else{
arr[k]=right[j];
j++;
k++;
}
}
while(i<left_size){
arr[k]=left[i];
i++;//先赋值、再自增
k++;
}
while(j<right_size){
arr[k]=right[j];
j++;
k++;
}
}
void mergesort(int arr[],int L,int R){
if(L==R){
return;
}
else{
int M=( L + R ) / 2 ;
mergesort(arr, L, M);
mergesort(arr, M+1, R);
merge(arr , L, M+1, R);
}
}
int main(){
int arr[]={2,5,3,9,7,4,1,8};
int L=0 ; int R=7;
mergesort(arr,L,R);
int i;
for(i=0;i<=R;i++){
printf("%d ",arr[i]);
}
}
递归段代码
void mergesort(int arr[],int L,int R){
if(L==R){
return;
}
else{
int M=( L + R ) / 2 ;
mergesort(arr, L, M);
mergesort(arr, M+1, R);
merge(arr , L, M+1, R);
}
}