嵌入式100题(51):归并排序

归并排序

  归并排序:归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个序列(1次比较和交换),然后把各个有序的段序列合并成一个有序的长序列,不断合并直到原序列全部排好序。可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也没有人故意交换,这不会破坏稳定性。那么,在短的有序序列合并的过程中,稳定是是否受到破坏?没有,合并过程中我们可以保证如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,这样就保证了稳定性。所以,归并排序也是稳定的排序算法。

  代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
 
void merge(int a[],int l,int r,int mid)
{
  int aux[r-l+1],i,j,k;
  for(k=l;k<=r;k++)
{
  	aux[k-l]=a[k];
  }
  i=l;
  j=mid+1;
  for(k=l;k<=r;k++)
  {
  	if(i>mid)
  	{
  		a[k]=aux[j-l];
  		j++;
	 }
	else if(j>r)
	{
		a[k]=aux[i-l];
		i++;
	}
	else if(aux[i-l]>aux[j-l])
	{
		a[k]=aux[j-l];
		j++;
	}
	else
	{
		a[k]=aux[i-l];
		i++;
			}
	  }	
}

void merge_sort(int a[],int l,int r)
{
   if(l>=r)
	return ;
	int mid=(l+r)/2;
	merge_sort(a,l,mid);
	merge_sort(a,mid+1,r);
	merge(a,l,r,mid);	
}
 
void mergesort(int a[],int l,int r)
{
	merge_sort(a,l,r-1);
}

int main()
{
	int a[105],n,i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	mergesort(a,0,n);
	for(i=0;i<n;i++)
	printf("%d ",a[i]);
	return 0;
 }

  

posted @ 2021-02-26 13:53  角色人生  阅读(444)  评论(0)    收藏  举报