归并排序算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法导论第一次上机报告

班级:1403018姓名:张可心学号:14030188030

(一)题目一

一、问题

Design aΘ(n lg n)-time algorithm that,given a set S of n integers and another integer x,determines whether or not there exist two elements in S whose sum is exactly x.

二、问题分析

集合S中有n个整数,给定一个整数x,设计一个算法,求出S中是否有两个元素相加之和为x。首先采用归并排序算法,复杂度为nlg n。再设计算法进行查找。

三、算法伪代码

merge(A,beg1,mid,end1)

n1=mid-beg1+1

n2=end1-mid

let A1[1..n1+1]andA2[1..n2+1]be new arrays

for i=1to n1

A1[i]=A[beg1+i-1]

for j=1to n2

A2[j]=A[mid+j]

A1[n1+1]=∞

A2[n2+1]=∞

i=1j=1

for k=beg1to end1

if A1[i]≤A2[j]

A[k]=A1[i]

i=i+1else A[k]=A2[j]

j=j+1

merge_sort(A,beg1,end1)

if beg1

mid=(beg1+end1)/2

merge_sort(A,beg1,mid)

merge_sort(A,mid+1,end1)

merge(A,beg1,mid,end1)

main(A,n,x)

A[n+1]=∞

cin>>n>>x

for i=1to n

cin>>A[i]

i=i+1merge_sort(A,1,n)

int i=1,j=n,t=0;

while i!=j if A[i]+A[j]

i=i+1if A[i]+A[j]>x

j=j-1if A[i]+A[j]=x

cout<<"YES"<

t=1break

if t=0cout<<"NO"<

return0

四、算法分析

首先采用归并排序,分为递归与合并两个部分,合并部分中A是一个数组,beg1、mid、end1为下标,满足beg1≤mid<end1,A[beg1...mid]与A[mid+1...end1]都是已排序好的,并合并成一个已排序好的子数组代替当前子数组A[beg1...end1]。pro过程的时间代价为Ɵ(n)其中n=end1-beg1 +1为待合并元素个数;归并的递归过程,归并的临界点与数组元素为1,因为数组元素个数为1,代表数组元素已排序。否则进行数组一分为2的操作。利用merge-sort(A,beg1,end1)对子数组A[beg1...end1]进行排序。如果beg1≥end1,则该子数组中至多只有一个元素,当然就是已排序

的。否则,分解步骤就计算出一个下一个mid,将A[beg1...end1]分解为A[beg1...mid]和A[mid+1...end1],各含[n/2]个元素。最后进行查找,对排序过后的整数从两头相加,若结果大于x,则从末尾倒序取数再相加,若结果小于x,则从开头取下一个整数相加。总时间复杂度为n lg n。

五、测试结果

INPUT:4311302467 OUTPUT:YES

INPUT:5211792564

OUTPUT:NO

(二)题目二

一、问题

Let A[1‥n]be an array of n distinct numbers.If iA[j],then the pair(i, j)is called an inversion of A.

Give an algorithm that determines the number of inversions in any permutation on n elements inΘ(n lg n)worst-case time.(Hint:Modify merge sort.)

二、问题分析

由题目知,要求出A中的逆序对数,且时间复杂度在最坏情况下为n lg n。

故仍采用归并排序算法,并在其中加入计数代码。

三、算法伪代码

count=0

merge(A,beg1,mid,end1)

n1=mid-beg1+1

n2=end1-mid

let A1[1..n1+1]andA2[1..n2+1]be new arrays

for i=1to n1

A1[i]=A[beg1+i-1]

for j=1to n2

A2[j]=A[mid+j]

A1[n1+1]=∞

A2[n2+1]=∞

i=1j=1

for k=beg1to end1

if A1[i]≤A2[j]

A[k]=A1[i]

i=i+1else A[k]=A2[j]

j=j+1count=count+(n1-i)

merge_sort(A,beg1,end1)

if beg1

mid=(beg1+end1)/2

merge_sort(A,beg1,mid)

merge_sort(A,mid+1,end1)

merge(A,beg1,mid,end1)

main(n,A)

A[n+1]=∞

cin>>n for i=1to n

cin>>A[i]

i=i+1

merge_sort(A,1,n)

cout<

四、算法分析

归并排序算法分析与题目一相似,合并复杂度为n,递归复杂度为lg n,总时间复杂度为n lg n。在合并过程中,每出现一个逆序对,count加一,并在主函数中输出。

相关文档
最新文档