归并排序
前言
学生党,手写一下归并排序的递归及非递归实现。
一、递归实现
(1)先写merge函数:
void my_merge(int a[],int left,int mid,int right){
int i=left,j=mid+1,k=0;
int b[right-left+1];
while(i<=mid&&j<=right){
if(a[i]<=a[j]){
b[k++] = a[i++];
}else{
b[k++] = a[j++];
}
}
while(i<=mid){
b[k++] = a[i++];
}
while(j<=right){
b[k++] = a[j++];
}
for(int t=0;t<k;t++){
a[left+t] = b[t];
}
return;
}
(2)然后是归并排序:
void merge_sort(int a[],int left, int right){
if(right <= left) return;
int mid = (left+right)/2;
merge_sort(a, left, mid);
merge_sort(a, mid+1, right);
my_merge(a, left, mid, right);
return;
}
二、非递归实现
(1)merge函数与上同,不再单独贴出:
(2)非递归实现:
void my_merge(int a[],int left,int mid,int right){
int i=left,j=mid+1,k=0;
int b[right-left+1];
while(i<=mid&&j<=right){
if(a[i]<=a[j]){
b[k++] = a[i++];
}else{
b[k++] = a[j++];
}
}
while(i<=mid){
b[k++] = a[i++];
}
while(j<=right){
b[k++] = a[j++];
}
for(int t=0;t<k;t++){
a[left+t] = b[t];
}
return;
}
void _merge_sort(int a[], int len){
int gap = 1;
while(gap<len){
for(int i=0; i<len; i+=2*gap){
if(i+gap>=len){
break;
}else{
my_merge(a, i, i+gap-1, min(len-1,i+2*gap-1));
}
}
gap *= 2;
}
return;
}
三、测试结果
截止22年2月8号,测试无误。