排序演算法練習(二)

2022-07-17 04:18:08 字數 2204 閱讀 7119

分治演算法_

求逆序對

ayyzoj p1434

【問題描述】

給定乙個序列a1,a2,…,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目。

【輸入格式】

第一行為n,表示序列長度,接下來的n行,第i+1行表示序列中的第i個數。

【輸出格式】

所有逆序對總數。

【輸入樣例】43

232【輸出樣例】

3【資料範圍】

n<=10^5,ai<=10^5。

思路:與歸併排序聯絡起來。

分析:歸併排序是將序列a[1,h]分成兩部分——a[1,mid]和a[mid+1,h]分別進行歸併排序,然後將這兩部分合併起來。

在合併的過程中(設1<=i<=mid,mid+1<=j<=h),

當a[i]<=a[j]時,並不產生逆序對;

當a[i]>a[j]時,在前半部分a[1,mid]中,比a[i]大的數都比a[j]大,將a[j]放在a[i]前面的話,逆序數要加上mid-i+1.(i..mid 共有mid-i+1個數)

因此,可以在歸併排序中的合併過程中計算逆序對的數量。

1

var2 a,r:array[1..100000] of

longint;

3i,n:longint;ans:int64;

4procedure

mergesort(s,t:longint);

5var

6m,i,j,k:longint;

7begin

8if s=t then

exit;

9 m:=(s+t) div2;

10mergesort(s,m);

11 mergesort(m+1

,t);

12 i:=s;

13 j:=m+1

;14 k:=s;

15while (i<=m) and (j<=t) do

16if a[i]<=a[j] then

17begin r[k]:=a[i];inc(i);inc(k);end

18else

19begin

ans:=ans+m-i+1; r[k]:=a[j]; inc(j); inc(k);end;20

while i<=m do

begin r[k]:=a[i]; inc(i); inc(k);end;21

while j<=t do

begin r[k]:=a[j]; inc(j); inc(k);end;22

for i:=s to t do a[i]:=r[i];

23end;24

begin

25readln(n);

26for i:=1

to n do

readln(a[i]);

27 mergesort(1

,n);

28writeln(ans);

29end.

排序演算法_

車廂重組

ayyzoj p1437

這題的描述讓人一眼覺得就是氣泡排序,老師說正解應該是歸併,可是資料太弱,冒泡就水過了。

1

program

p1437;

2var

3n,i,j,t,k:longint;

4 a:array[1..10000] of

longint;

5flag:boolean;

6begin

7readln(n);

8for i:=1

to n do

read(a[i]);

9for j:=1

to n-1

do10

begin

11 flag:=true;

12for i:=1

to n-j do

13if a[i]>a[i+1] then

begin

14 t:=a[i];a[i]:=a[i+1];a[i+1]:=t; inc(k);

15 flag:=false; end;16

if flag then

break;

17end;18

write(k);

19end.

氣泡排序

演算法練習 二

不知道為什麼網上找的關於acm的資料幾乎都是用pascal語言寫的,而我們學校要求是必須用c c 寫,我也知道語言只是工具,演算法才是核心,但我看到滿篇的pascal我還是沒有耐心研讀.如果大家有什麼好的關於下面暴露一下今天寫的 這兩道題還有比較有意思的.第一題 有什麼不好的地方,希望得到大家的批評...

C 排序演算法練習 快速排序

在所有的技藝中,武功是最強調內功的,比如同樣都學了辟邪劍譜,為什麼岳不群要比林平之厲害?武功的招式固然重要,但沒有深厚的內功,威力會大打折扣.那麼,內功是怎麼練出來的呢?冬練三九,夏練三伏,古人早有定論.而這些道理用在程式開發上也一樣適用.include using namespace std 演算...

C 演算法練習二

1.使用者輸入三個字串,用倒序輸出使用者輸入的字串 public void method console.readkey 2.使用者輸入乙個數字和乙個寬度,寬度也是乙個正整數,然後用第乙個數字列印出乙個直角等腰三角形 public void method int digit,int width co...