#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//合并
void merge(int* arr,int* tmp_arr,int left,int mid,int right)
{
//左半部分起点位置
int l_pos=left;
//右半部分起点位置
int r_pos=mid+1;
int pos=left;
while(l_pos<=mid && r_pos<=right)
{
if(arr[l_pos]<=arr[r_pos])
tmp_arr[pos++]=arr[l_pos++];
else
tmp_arr[pos++]=arr[r_pos++];
}
//合并左右半区剩余元素
while (l_pos<=mid)
{
tmp_arr[pos++]=arr[l_pos++];
}
while(r_pos<=right)
{
tmp_arr[pos++]=arr[r_pos++];
}
while (left<=right)
{
arr[left]=tmp_arr[left];
left++;
}
}
//归并排序
void msort(int* arr,int* tmp_arr,int left,int right)
{
if(left<right)//只有一个元素不用排序
{
int mid=(left+right)/2;
msort(arr,tmp_arr,left,mid);
msort(arr,tmp_arr,mid+1,right);
merge(arr,tmp_arr,left,mid,right);
}
}
//归并排序入口
void merge_sort(int* arr,int n)
{
//分配一个辅助数组
int* tmp_arr=(int*)malloc(sizeof(int)*n);
if(tmp_arr)//辅助数组分配成功
{
msort(arr,tmp_arr,0,n-1);
free(tmp_arr);
}
else
{
printf("error");
}
}
//数组打印
void print_arr(int* arr,int n)
{
for(int i=0;i<n;i++)
{
printf("%d\n",arr[i]);
}
}
int main()
{
int n;
scanf("%d",&n);
int* arr = (int*) malloc (sizeof(int)*n);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
merge_sort(arr,n);
print_arr(arr,n);
free(arr);
}
归并排序源代码
于 2022-09-06 18:51:33 首次发布