#include<stdio.h>
#define N 9
void merge(int a[],int b[],int left,int mid,int right)
{
	//合并排序,i=left也就是从数组的最左边出发,j从数组右半部份的最左边出发 
	int i = left,j = mid + 1,index = left;//index作为b数组的下标 
	while(i <= mid && j <= right){
		if(a[i] < a[j]) 
		{
			b[index] = a[i];
			index ++;
			i ++;
		}
		else{
			b[index] = a[j];
			index ++;
			j ++;
		}
	}
	//极端情况 
	if(i > mid)
	{
		for(int q = j;q <= right;q ++)
		{
			b[index] = a[q];
			k ++;
		}
	}
	else{
		for(int q = i;q <= mid;q ++)
		{
			b[index] = a[q];
			index ++;
		}
	}
}
void mergepass(int a[],int b[],int s,int n)
{
	int i = 0;
	int j;
	while(i <= n - 2 * s)
	{
		merge(a,b,i,i + s - 1,i + 2 * s - 1);
		i = i + 2 * s;
	}
	if(i + s < n)//(i + s - 1 < n - 1)
		merge(a,b,i,i + s - 1,n - 1);
	else
	{
		for(j = i;j <= n - 1;j ++)
			b[j] = a[j];
	}
}
void mergesort(int a[],int n)
{
	int b[n];
	int s = 1;
	while(s < n)
	{
		mergepass(a,b,s,n);
		s += s;
		mergepass(b,a,s,n);
		s += s;
	}
}
int main()
{
	int i;
	int a[N] = {4,5,2,6,8,1,3,9,7};
	mergesort(a,N);
	for(i = 0;i < N;i ++){
		printf("%d ",a[i]);
	}
	putchar('\n');
	return 0;
}
                
        
    
                    转载请注明原文地址: https://ju.6miu.com/read-3637.html