JSMS41-归并排序算法

90 阅读1分钟

归并排序算法图解,其实就是利用分而治之分之思想来解决。递归的解决左半部分,然后递归的解决右半部分。当左半部分的元素单位为一个的时候然后比较交换,为2的时候左右两边比较交换,这样一层层的弹出递归。看下面动态图

#include <stdio.h>

void merge(int a[],int tmp[],int left,int right,int rightend)
{
	int leftend=right-1;
	int tmpa=left;
	int len=rightend-left+1;
	while(left<=leftend&&right<=rightend)
	{
		if(a[left]<=a[right])
		{
			tmp[tmpa++]=a[left++];
		}else if(a[right]<a[left])
		{
			tmp[tmpa++]=a[right++];
		}
	}
	while(left<=leftend)
	{
		tmp[tmpa++]=a[left++];
	}
	while(right<=rightend)
	{
		tmp[tmpa++]=a[right++];
	}
	for(int i=0;i<len;i++,rightend--)
	{
		a[rightend]=tmp[rightend];
	}
}
void print(int len,int data[])
{
	for(int i=0;i<len;i++)
	{
		printf("%d\t",data[i]);
	}
}

int main()
{
	int a[10]={3,7,13,15,19,21,10,13,17,19,};
	int left=0;
	int r=6;
	int rightend=9;
	int tmp[12]={};
	merge(a,tmp,left,r,rightend);
	int len=sizeof(a)/sizeof(a[0]);
	print(len,a);
}