Merger

Merger

Suppose now that the two ordered list of points, how synthesizes them into an ordered list. This operation is called a merge.

Merge sort of advantage

Generally, we sort used generally choose to insert other basic bubble sort, sometimes the pursuit of the running time, could use fast row, but fast row is an unstable sort, then there will be a merge sort, merge Sort only stable, very fast, but it is time to take the space to change, twice as big as the sort of general space.

Merge sort implementation

Put an unordered list has been sub-divided into multiple lists only one member, then a list must be ordered, then one by one merger, and finally sorted up.
Here is the code to achieve

#include"stdio.h"
#include"string.h"
long long sum;
int gs;
long long a[101000],b[101000];//a是存放结果 b是存放暂时结果
int Merge(long long r[],long long r1[],int s,int m,int t)
{
    int i=s;
    int j=m+1;
    int k=s;
    while(i<=m&&j<=t)//规定它的范围
    {
        if(r[i]<=r[j])
        {
        	r1[k++]=r[i++];
		}
        else
        {
        	r1[k++]=r[j++];
		}
            
    }
    while(i<=m)//如果有个列表的成员有多就把剩下的全部放进去
        r1[k++]=r[i++];
    while(j<=t)//同理
        r1[k++]=r[j++];
    for(int l=s; l<k; l++)//最后把b中暂时存放的放到a中
        r[l]=r1[l];
}
 
void MergeSort(long long r[],long long r1[],int s,int t)
{
    if(s==t) //只有一个成员时停止
        return;
    else
    {
        int m=(s+t)/2;
        MergeSort(r,r1,s,m);
        MergeSort(r,r1,m+1,t);//一直调用自己 一直分
        Merge(r,r1,s,m,t);
    }
}

main()  
{
	int n,i;
	while(scanf("%d",&n)!=EOF)
	{
		while(n--)
		{
			memset(a,0,sizeof(a));
			memset(b,0,sizeof(b));	
		while(scanf("%d",&gs)!=EOF)
		{
			int qw;
			for(qw=0;qw<gs;qw++)
			scanf("%lld",a+qw);
			MergeSort(a,b,0,gs-1);
			for(i=0;i<gs;i++)
			printf("%d ",a[i]) ;
			printf("\n");
		}
		}
		
	 } 
}

Merge sort of application

In one arrangement, if the longitudinal position of a pair of numbers in reverse order of magnitude, i.e. the number greater than the number in front of the latter, they are called a reverse order. A reverse arrangement on the total number of the called number in reverse order.
Now, to give you a sequence of N elements, you determine the number of reverse it is.
For example inverse number of 1132 it is.
Code

#include"stdio.h"
#include"string.h"
long long sum;
int gs;
long long a[101000],b[101000];
int Merge(long long r[],long long r1[],int s,int m,int t)
{
    int i=s;
    int j=m+1;
    int k=s;
    while(i<=m&&j<=t)
    {
        if(r[i]<=r[j])
        {
        	r1[k++]=r[i++];
		}
        else
        {
        	r1[k++]=r[j++];
        	sum+=m-i+1;
		}
            
    }
    while(i<=m)
        r1[k++]=r[i++];
    while(j<=t)
        r1[k++]=r[j++];
    for(int l=s; l<k; l++)
        r[l]=r1[l];
}
 
void MergeSort(long long r[],long long r1[],int s,int t)
{
    if(s==t)
        return;
    else
    {
        int m=(s+t)/2;
        MergeSort(r,r1,s,m);
        MergeSort(r,r1,m+1,t);
        Merge(r,r1,s,m,t);
    }
}

main()  
{
	int n,i;
	while(scanf("%d",&n)!=EOF)
	{
		while(n--)
		{
			memset(a,0,sizeof(a));
			memset(b,0,sizeof(b));	
		while(scanf("%d",&gs)!=EOF)
		{
			sum=0;
			int qw;
			for(qw=0;qw<gs;qw++)
			scanf("%lld",a+qw);
			MergeSort(a,b,0,gs-1);
			printf("%lld\n",sum); 
		}
		}
		
	 } 
}
Released four original articles · won praise 0 · Views 66

Guess you like

Origin blog.csdn.net/qq_43107313/article/details/104076965