基於歸併排序求小和問題

2021-10-02 01:29:32 字數 1701 閱讀 7793

package smallsum;

import testarraymethonunit.testarraymethonunit;

/** * @author: 黃文偉

* @description: 求小和問題,給定陣列,陣列中每個元素與左邊元素相比,

* 若左邊元素小則計為小和,求出陣列的總小和

* * 例:,

* 3左邊沒數,小和0;1左邊為3,小和0,

* 2左邊為3、1,小和1,總的小和為0+0+1=1

*

* 解題:採用歸併排序思路解題,遞迴陣列居中劃分,

* 直至劃分到乙個數時對左右陣列進行外排

* 外排過程先判斷左邊陣列是否小於右邊,

* 若小就將左邊數與右邊陣列長度-下標+1向乘計算出小和,

* 再逐層返回遞迴,最終可得到總的小和。

* @date:created in 9:19 2019/8/9

*/public

class

smallsum

return

mergesort

(arrs,

0, arrs.length-1)

;}// 對陣列進行遞迴劃分

public

static

intmergesort

(int

arrs,

int l,

int r)

int mid = l +

((r - l)

>>1)

;return

mergesort

(arrs, l, mid)

+mergesort

(arrs, mid+

1, r)

+merge

(arrs, l, mid, r);}

// 對陣列進行左右外排,並返回小和

public

static

intmerge

(int

arrs,

int l,

int mid,

int r)

while

(p1 <= mid)

while

(p2 <= r)

// 將排好序的輔助陣列遍歷回原陣列

for(i =

0; i < help.length; i++

)return res;

}public

static

void

main

(string[

] args)}if

(success ==

true

)else

}// 使用暴力寫法,結果絕對正確,作用是給演算法校驗正確性

public

static

intrightmethon

(int

arrs)

for(

int i =

0; i < arrs.length; i++)}

}return sum;

}}

關於歸併排序

暑假集訓的時候就有接觸到歸併排序,但是當時並沒什麼好好地去學習。開學之後資料結構老師提了好幾次歸併排序,我發現模板 我已經忘的一乾二淨了。於是這兩天重新學了一遍。所謂歸併排序,就是將兩個排好序的序列歸併在一起,形成乙個新序列。那麼,如何得到排好序的序列呢,這裡就體現了分治的思想。我們可以將乙個序列,...

關於歸併排序

我只能說看懂歸併排序,你的遞迴思想會再有乙個昇華。其實在之前我做過一道演算法題,用到的就是這種兩個遞迴在一起。馮諾依曼可真是智慧型。我之所以寫成1,2,3,4,3 2 1 根源還是在於遞迴。在重複一句當初我理解遞迴時的最精闢的一句話 在遞迴中的return,不是結束,而是返回它的被調函式。也就是說,...

關於歸併排序和逆序對

今天學習了歸併排序和逆序對,逆序對經過多次測試才成功,所以傳上來以作紀念,新手創作,不喜勿噴 歸併排序 public static void mergesort1 int arrs mergesort1 arrs,0,arrs.length 1 public static void mergesor...