閱讀464 返回首頁    go 阿裏雲 go 技術社區[雲棲]


歸並求逆序對【模板】

代碼:

#include <stdio.h>

const int M=999999;

int A[500];
int cunt=0;
int L[250],R[250];

void Merge(int Left,int Middle,int Right)
{
	int n1=Middle-Left+1;
	int n2=Right-Middle;

	for(int i=1;i<=n1;i++)
		L[i]=A[Left+i-1];
	for(i=1;i<=n2;i++)
		R[i]=A[Middle+i];

	L[n1+1]=M;
	R[n2+1]=M;

	i=1;
	int j=1;
	for(int k=Left;k<=Right;k++)
	{
		if(L[i]<=R[j])
			A[k]=L[i++];

		else
		{
			A[k]=R[j++];
			cunt+=n1-i+1;                 //cunt為全局變量
		}
	}
}

void Merge_sort(int Left,int Right)
{
	int Middle;
	if(Left<Right)
	{
		Middle=(Left+Right)/2; 
		Merge_sort(Left,Middle);                      // 二分分解左部分
		Merge_sort(Middle+1,Right);                // 二分分解有部分
		Merge(Left,Middle,Right);                      //合並兩部分
	}
}

int main()
{
	int n;
	scanf("%d",&n);

	int i;
	for(i=1;i<=n;i++)
		scanf("%d",&A[i]);

	Merge_sort(1,n);

	printf("%d\n",cunt);

	return 0;
}


運行結果:

5
2 3 8 6 1

5

最後更新:2017-04-03 14:54:11

  上一篇:go RHEL 6 安裝 chrome [備忘]
  下一篇:go maven項目建立pom.xml報無法解析org.apache.maven.plugins:maven-resources-plugin:2.4.3